From 6c7cc7aa603404f4ed5b1c7e4a9f29f6baeb333a Mon Sep 17 00:00:00 2001 From: dimmur-brw Date: Fri, 14 Nov 2025 09:45:15 +0100 Subject: [PATCH 01/13] Show primary field value in workspace search result for RowSearchType (#4205) Show primary field value in workspace search result for RowSearchType --- .../baserow/contrib/database/search_types.py | 110 ++++++++++--- .../api/search/test_workspace_search_views.py | 8 +- .../search/test_database_search_types.py | 148 +++++++++++++++++- .../search/test_workspace_search_handler.py | 9 +- ...e_in_workspace_search_result_for_rows.json | 8 + 5 files changed, 258 insertions(+), 25 deletions(-) create mode 100644 changelog/entries/unreleased/feature/4181_show_primary_field_value_in_workspace_search_result_for_rows.json diff --git a/backend/src/baserow/contrib/database/search_types.py b/backend/src/baserow/contrib/database/search_types.py index 6e3db200fc..a936fdf8ae 100644 --- a/backend/src/baserow/contrib/database/search_types.py +++ b/backend/src/baserow/contrib/database/search_types.py @@ -1,4 +1,5 @@ -from typing import Dict, Iterable, List, Optional +from collections import defaultdict +from typing import Dict, Iterable, List, Optional, Tuple from django.contrib.auth.models import AbstractUser from django.contrib.postgres.search import SearchQuery, SearchRank @@ -8,8 +9,10 @@ F, FloatField, IntegerField, + OuterRef, Prefetch, QuerySet, + Subquery, TextField, Value, When, @@ -20,11 +23,13 @@ from baserow.contrib.database.fields.handler import FieldHandler from baserow.contrib.database.fields.models import Field from baserow.contrib.database.fields.operations import ListFieldsOperationType +from baserow.contrib.database.fields.registries import field_type_registry from baserow.contrib.database.models import Database from baserow.contrib.database.search.handler import SearchHandler from baserow.contrib.database.search_base import DatabaseSearchableItemType from baserow.contrib.database.table.models import Table from baserow.contrib.database.table.operations import ReadDatabaseTableOperationType +from baserow.core.db import specific_iterator from baserow.core.handler import CoreHandler from baserow.core.models import Workspace from baserow.core.search.data_types import SearchResult @@ -407,9 +412,56 @@ def get_union_values_queryset(self, user, workspace, context) -> QuerySet: return qs + def _fetch_primary_field_values( + self, + rows_list: List[Dict], + table_id_to_primary_field: Dict[int, Tuple[Table, Field]], + ) -> Dict[Tuple[int, int], str]: + """ + Fetch primary field values for all rows efficiently. + Uses the same approach as link row fields - leverages get_model() + and model.__str__() which already handles all field types properly. + + :param rows_list: List of row dicts from search results + :param table_id_to_primary_field: Mapping of table IDs to their primary field + :return: {(table_id, row_id): human_readable_value} + """ + + rows_by_table = defaultdict(list) + for r in rows_list: + payload = r.get("payload", {}) + table_id = payload.get("table_id") + row_id = payload.get("row_id") + rows_by_table[table_id].append(row_id) + + if not rows_by_table: + return {} + + primary_values = {} + + for table_id, row_ids in rows_by_table.items(): + table, primary_field = table_id_to_primary_field.get(table_id) + model = table.get_model( + fields=[primary_field], field_ids=[], add_dependencies=False + ) + rows_qs = ( + model.objects.only(primary_field.db_column) + .filter(id__in=row_ids) + .order_by() + ) + field_type = field_type_registry.get_by_model(primary_field) + rows_qs = field_type.enhance_queryset( + rows_qs, primary_field, primary_field.db_column + ) + + for row in rows_qs: + primary_values[(table_id, row.id)] = str(row) + + return primary_values + def postprocess(self, rows: Iterable[Dict]) -> List[SearchResult]: """ - Return minimal row results + Return minimal row results with primary field values for better UX. """ if not rows: @@ -435,7 +487,13 @@ def postprocess(self, rows: Iterable[Dict]) -> List[SearchResult]: FieldHandler() .get_base_fields_queryset() .filter(id__in=field_ids) - .select_related("table__database") + .annotate( + primary_field_id=Subquery( + Field.objects.filter( + table_id=OuterRef("table_id"), primary=True + ).values("id")[:1] + ) + ) ) field_id_to_name = {} @@ -444,24 +502,35 @@ def postprocess(self, rows: Iterable[Dict]) -> List[SearchResult]: table_id_to_database_id = {} database_id_to_name = {} database_id_to_workspace_id = {} + table_id_to_primary_field = {} + + primary_field_ids = set() + for f in fields_qs: + primary_field_ids.add(f.primary_field_id) + + primary_fields = { + f.id: f + for f in specific_iterator(Field.objects.filter(id__in=primary_field_ids)) + } for f in fields_qs: field_id_to_name[f.id] = f.name field_id_to_table_id[f.id] = f.table_id - if f.table_id: - table_id_to_name[f.table_id] = getattr(f.table, "name", None) - table_id_to_database_id[f.table_id] = getattr( - f.table, "database_id", None - ) - if getattr(f.table, "database_id", None): - database = getattr(f.table, "database", None) - if database is not None: - database_id_to_name[f.table.database_id] = getattr( - database, "name", None - ) - database_id_to_workspace_id[f.table.database_id] = getattr( - database, "workspace_id", None - ) + table_id_to_name[f.table_id] = f.table.name + table_id_to_database_id[f.table_id] = f.table.database_id + database_id_to_name[f.table.database_id] = f.table.database.name + database_id_to_workspace_id[ + f.table.database_id + ] = f.table.database.workspace_id + table_id_to_primary_field[f.table_id] = ( + f.table, + primary_fields[f.primary_field_id], + ) + + # Fetch primary field values for all rows, reusing already-fetched tables + primary_values = self._fetch_primary_field_values( + rows_list, table_id_to_primary_field + ) results_list = [] for r in rows_list: @@ -492,11 +561,15 @@ def postprocess(self, rows: Iterable[Dict]) -> List[SearchResult]: subtitle_suffix = " / ".join(parts) if parts else None subtitle = f"Row in {subtitle_suffix}" if subtitle_suffix else None + # Get primary field value or fallback to "Row #N" + primary_value = primary_values.get((table_id_int, int(row_id))) + title = primary_value if primary_value else f"Row #{row_id}" + results_list.append( SearchResult( type=self.type, id=object_id, - title=f"Row #{row_id}", + title=title, subtitle=subtitle, description=None, metadata={ @@ -509,6 +582,7 @@ def postprocess(self, rows: Iterable[Dict]) -> List[SearchResult]: "table_name": table_name, "field_name": field_name, "rank": rank, + "primary_field_value": primary_value, }, ) ) diff --git a/backend/tests/baserow/api/search/test_workspace_search_views.py b/backend/tests/baserow/api/search/test_workspace_search_views.py index bc718beb3d..194454005d 100644 --- a/backend/tests/baserow/api/search/test_workspace_search_views.py +++ b/backend/tests/baserow/api/search/test_workspace_search_views.py @@ -309,8 +309,12 @@ def test_workspace_search_scoped_to_requested_workspace(api_client, data_fixture table1 = data_fixture.create_database_table(database=db1, name="Common Table") table2 = data_fixture.create_database_table(database=db2, name="Common Table") - text_field1 = data_fixture.create_text_field(table=table1, name="Text") - text_field2 = data_fixture.create_text_field(table=table2, name="Text") + text_field1 = data_fixture.create_text_field( + table=table1, name="Text", primary=True + ) + text_field2 = data_fixture.create_text_field( + table=table2, name="Text", primary=True + ) from baserow.contrib.database.rows.handler import RowHandler from baserow.contrib.database.search.handler import SearchHandler diff --git a/backend/tests/baserow/contrib/database/search/test_database_search_types.py b/backend/tests/baserow/contrib/database/search/test_database_search_types.py index 45e2a0d2c6..04cf5e5cf5 100644 --- a/backend/tests/baserow/contrib/database/search/test_database_search_types.py +++ b/backend/tests/baserow/contrib/database/search/test_database_search_types.py @@ -132,7 +132,9 @@ def test_row_search_type_basic_functionality(data_fixture): workspace = data_fixture.create_workspace(user=user) database = data_fixture.create_database_application(workspace=workspace) table = data_fixture.create_database_table(database=database, name="Test Table") - text_field = data_fixture.create_text_field(table=table, name="Text Field") + text_field = data_fixture.create_text_field( + table=table, name="Text Field", primary=True + ) from baserow.contrib.database.rows.handler import RowHandler @@ -161,8 +163,142 @@ def test_row_search_type_basic_functionality(data_fixture): assert len(results) >= 1 assert results[0].id == f"{table.id}_{row1.id}" - assert results[0].title == "Row #1" + assert results[0].title == "Test content" assert results[0].subtitle == f"Row in {database.name} / {table.name}" + assert results[0].metadata["primary_field_value"] == "Test content" + + +@pytest.mark.workspace_search +@pytest.mark.django_db(transaction=True) +def test_row_search_displays_primary_field_values_for_different_types(data_fixture): + user = data_fixture.create_user() + workspace = data_fixture.create_workspace(user=user) + database = data_fixture.create_database_application(workspace=workspace) + + from baserow.contrib.database.rows.handler import RowHandler + from baserow.contrib.database.search.handler import SearchHandler + from baserow.core.search.handler import WorkspaceSearchHandler + + row_handler = RowHandler() + + text_table = data_fixture.create_database_table( + database=database, name="Text Table" + ) + text_field = data_fixture.create_text_field( + table=text_table, name="Name", primary=True + ) + row_handler.create_rows( + user=user, + table=text_table, + rows_values=[{f"field_{text_field.id}": "John Doe"}], + ) + + number_table = data_fixture.create_database_table( + database=database, name="Number Table" + ) + number_field = data_fixture.create_number_field( + table=number_table, name="ID", primary=True + ) + row_handler.create_rows( + user=user, table=number_table, rows_values=[{f"field_{number_field.id}": 42}] + ) + + rating_table = data_fixture.create_database_table( + database=database, name="Rating Table" + ) + rating_field = data_fixture.create_rating_field( + table=rating_table, name="Score", primary=True, max_value=5 + ) + row_handler.create_rows( + user=user, table=rating_table, rows_values=[{f"field_{rating_field.id}": 4}] + ) + + select_table = data_fixture.create_database_table( + database=database, name="Select Table" + ) + select_field = data_fixture.create_single_select_field( + table=select_table, name="Status", primary=True + ) + option = data_fixture.create_select_option( + field=select_field, value="Active", color="blue" + ) + row_handler.create_rows( + user=user, + table=select_table, + rows_values=[{f"field_{select_field.id}": option.id}], + ) + + file_table = data_fixture.create_database_table( + database=database, name="File Table" + ) + file_field = data_fixture.create_file_field( + table=file_table, name="Attachment", primary=True + ) + user_file = data_fixture.create_user_file(original_name="test.txt") + row_handler.create_rows( + user=user, + table=file_table, + rows_values=[ + { + f"field_{file_field.id}": [ + {"name": user_file.name, "visible_name": "test.txt"} + ] + } + ], + ) + + SearchHandler.create_workspace_search_table_if_not_exists(workspace.id) + for table in [text_table, number_table, rating_table, select_table, file_table]: + SearchHandler.initialize_missing_search_data(table) + SearchHandler.process_search_data_updates(table) + + handler = WorkspaceSearchHandler() + + results, _ = handler.search_all_types( + user, workspace, SearchContext(query="John", limit=10, offset=0) + ) + text_results = [r for r in results if r.metadata.get("table_id") == text_table.id] + assert len(text_results) >= 1 + assert text_results[0].title == "John Doe" + assert text_results[0].metadata["primary_field_value"] == "John Doe" + + results, _ = handler.search_all_types( + user, workspace, SearchContext(query="42", limit=10, offset=0) + ) + number_results = [ + r for r in results if r.metadata.get("table_id") == number_table.id + ] + assert len(number_results) >= 1 + assert number_results[0].title == "42" + assert number_results[0].metadata["primary_field_value"] == "42" + + results, _ = handler.search_all_types( + user, workspace, SearchContext(query="4", limit=10, offset=0) + ) + rating_results = [ + r for r in results if r.metadata.get("table_id") == rating_table.id + ] + assert len(rating_results) >= 1 + assert rating_results[0].title == "4" + assert rating_results[0].metadata["primary_field_value"] == "4" + + results, _ = handler.search_all_types( + user, workspace, SearchContext(query="Active", limit=10, offset=0) + ) + select_results = [ + r for r in results if r.metadata.get("table_id") == select_table.id + ] + assert len(select_results) >= 1 + assert select_results[0].title == "Active" + assert select_results[0].metadata["primary_field_value"] == "Active" + + results, _ = handler.search_all_types( + user, workspace, SearchContext(query="test.txt", limit=10, offset=0) + ) + file_results = [r for r in results if r.metadata.get("table_id") == file_table.id] + assert len(file_results) >= 1 + assert file_results[0].title == "test.txt" + assert file_results[0].metadata["primary_field_value"] == "test.txt" @pytest.mark.workspace_search @@ -173,8 +309,12 @@ def test_row_search_multiple_fields(data_fixture): database = data_fixture.create_database_application(workspace=workspace) table = data_fixture.create_database_table(database=database) - text_field1 = data_fixture.create_text_field(table=table, name="Field 1") - text_field2 = data_fixture.create_text_field(table=table, name="Field 2") + text_field1 = data_fixture.create_text_field( + table=table, name="Field 1", primary=True + ) + text_field2 = data_fixture.create_text_field( + table=table, name="Field 2", primary=True + ) from baserow.contrib.database.rows.handler import RowHandler diff --git a/backend/tests/baserow/contrib/database/search/test_workspace_search_handler.py b/backend/tests/baserow/contrib/database/search/test_workspace_search_handler.py index 3e8117bd84..2e7553b0d0 100644 --- a/backend/tests/baserow/contrib/database/search/test_workspace_search_handler.py +++ b/backend/tests/baserow/contrib/database/search/test_workspace_search_handler.py @@ -301,11 +301,18 @@ def _row_results(r): return [x for x in r["results"] if x["type"] == "database_row"] def _assert_row_shape(item): - assert "title" in item and item["title"].startswith("Row #") + # Title should now contain the primary field value, not "Row #" + assert ( + "title" in item + and isinstance(item["title"], str) + and len(item["title"]) > 0 + ) assert "subtitle" in item and " / " in item["subtitle"] md = item.get("metadata", {}) for k in ["workspace_id", "database_id", "table_id", "row_id", "field_id"]: assert k in md + # Should have primary_field_value in metadata + assert "primary_field_value" in md # Basic text res = do_search("text") diff --git a/changelog/entries/unreleased/feature/4181_show_primary_field_value_in_workspace_search_result_for_rows.json b/changelog/entries/unreleased/feature/4181_show_primary_field_value_in_workspace_search_result_for_rows.json new file mode 100644 index 0000000000..12b5feeac1 --- /dev/null +++ b/changelog/entries/unreleased/feature/4181_show_primary_field_value_in_workspace_search_result_for_rows.json @@ -0,0 +1,8 @@ +{ + "type": "feature", + "message": "Show primary field value in workspace search result for RowSearchType", + "domain": "database", + "issue_number": 4181, + "bullet_points": [], + "created_at": "2025-11-11" +} \ No newline at end of file From 8b1ea00782f3026597ae4760569bc43e37658c18 Mon Sep 17 00:00:00 2001 From: Davide Silvestri <75379892+silvestrid@users.noreply.github.com> Date: Fri, 14 Nov 2025 09:50:01 +0100 Subject: [PATCH 02/13] chore(AI Assistant): add disclaimer to responses --- .../assets/scss/components/assistant.scss | 10 +++++++++- .../components/assistant/AssistantMessageActions.vue | 4 ++++ .../modules/baserow_enterprise/locales/en.json | 3 ++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/enterprise/web-frontend/modules/baserow_enterprise/assets/scss/components/assistant.scss b/enterprise/web-frontend/modules/baserow_enterprise/assets/scss/components/assistant.scss index e545d89303..1a539e4a18 100644 --- a/enterprise/web-frontend/modules/baserow_enterprise/assets/scss/components/assistant.scss +++ b/enterprise/web-frontend/modules/baserow_enterprise/assets/scss/components/assistant.scss @@ -334,7 +334,6 @@ } } - .assistant__message { display: flex; @@ -749,3 +748,12 @@ gap: 8px; margin-top: 10px; } + +.assistant__disclaimer { + margin-top: 8px; + margin-left: 8px; + font-size: 11px; + color: $palette-neutral-600; + text-align: left; + line-height: 1.4; +} diff --git a/enterprise/web-frontend/modules/baserow_enterprise/components/assistant/AssistantMessageActions.vue b/enterprise/web-frontend/modules/baserow_enterprise/components/assistant/AssistantMessageActions.vue index 434e78c78b..7204c09813 100644 --- a/enterprise/web-frontend/modules/baserow_enterprise/components/assistant/AssistantMessageActions.vue +++ b/enterprise/web-frontend/modules/baserow_enterprise/components/assistant/AssistantMessageActions.vue @@ -39,6 +39,10 @@ +
+ {{ $t('assistantMessageActions.disclaimer') }} +
+ Date: Fri, 14 Nov 2025 09:37:46 +0000 Subject: [PATCH 03/13] Improving the debugging experience by showing the node type's error message in a tooltip when the Configure text is hovered. (#4244) --- .../components/workflow/WorkflowNodeContent.vue | 16 +++++++++++++++- web-frontend/modules/automation/nodeTypes.js | 13 +++++++++++++ .../modules/integrations/core/serviceTypes.js | 10 +++++----- 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/web-frontend/modules/automation/components/workflow/WorkflowNodeContent.vue b/web-frontend/modules/automation/components/workflow/WorkflowNodeContent.vue index 79e1e19be6..5d890148c1 100644 --- a/web-frontend/modules/automation/components/workflow/WorkflowNodeContent.vue +++ b/web-frontend/modules/automation/components/workflow/WorkflowNodeContent.vue @@ -6,7 +6,7 @@ 'workflow-node-content--dragging': isDragging, 'workflow-node-content--utility': nodeType.isUtilityNode, }" - :title="displayLabel" + :title="!isInError ? displayLabel : ''" :data-before-label="getDataBeforeLabel" :draggable="isDraggable" @dragstart="handleDragStart" @@ -31,6 +31,8 @@ { return nodeType.value.isInError({ service: props.node.service }) }) +/** + * This computed property retrieves the error message associated with + * the node if it is in an error state. + * @type {string} - The error message for the node. + */ +const errorMessage = computed(() => { + return nodeType.value.getErrorMessage({ + service: props.node.service, + node: props.node, + }) +}) + /** * This computed property checks if the node is ready for interaction. * A node is considered ready if it is not in read-only mode and not in diff --git a/web-frontend/modules/automation/nodeTypes.js b/web-frontend/modules/automation/nodeTypes.js index cdef9be19b..0e26df906c 100644 --- a/web-frontend/modules/automation/nodeTypes.js +++ b/web-frontend/modules/automation/nodeTypes.js @@ -148,6 +148,19 @@ export class NodeType extends Registerable { return this.serviceType.isInError({ service }) } + /** + * Returns the error message we should show when the node is in-error. + * By default, this is derived from the service type's `getErrorMessage` + * method, but can be overridden by the node type. + * @param {object} service - The service of the node. + * @param {object} node - The node for which the + * error message is being retrieved. + * @returns {string} - The error message. + */ + getErrorMessage({ service, node }) { + return this.serviceType.getErrorMessage({ service }) + } + /** * Returns whether this individual node is allowed to be deleted. * By default, all nodes (except triggers) are allowed to be deleted. diff --git a/web-frontend/modules/integrations/core/serviceTypes.js b/web-frontend/modules/integrations/core/serviceTypes.js index 66950cd081..3e22949087 100644 --- a/web-frontend/modules/integrations/core/serviceTypes.js +++ b/web-frontend/modules/integrations/core/serviceTypes.js @@ -143,11 +143,11 @@ export class CoreRouterServiceType extends WorkflowActionServiceTypeMixin( if (!service.edges?.length) { return this.app.i18n.t('serviceType.coreRouterEdgesRequired') } - const hasEdgeInError = service.edges.some((edge) => { - return this.getEdgeErrorMessage(edge) - }) - if (hasEdgeInError) { - return hasEdgeInError + for (const edge of service.edges) { + const errorMessage = this.getEdgeErrorMessage(edge) + if (errorMessage) { + return errorMessage + } } return super.getErrorMessage({ service }) } From 58b404babb770e774b6bced4a9ed346af094001f Mon Sep 17 00:00:00 2001 From: Davide Silvestri <75379892+silvestrid@users.noreply.github.com> Date: Fri, 14 Nov 2025 10:39:28 +0100 Subject: [PATCH 04/13] feat(AI Assistant): stop response generation from the UI (#4238) * Stop response generation * add tests * Address fedback --- .../api/assistant/serializers.py | 16 ++ .../baserow_enterprise/api/assistant/urls.py | 5 + .../baserow_enterprise/api/assistant/views.py | 43 ++++ .../baserow_enterprise/assistant/assistant.py | 186 +++++++++++++----- .../assistant/exceptions.py | 12 ++ .../src/baserow_enterprise/assistant/types.py | 22 ++- .../api/assistant/test_assistant_views.py | 72 +++++++ .../assistant/test_assistant.py | 161 +++++++++++++++ .../assets/scss/components/assistant.scss | 9 +- .../assistant/AssistantInputMessage.vue | 32 ++- .../assistant/AssistantMessageList.vue | 1 + .../components/assistant/AssistantPanel.vue | 10 + .../baserow_enterprise/locales/en.json | 7 +- .../baserow_enterprise/services/assistant.js | 36 ++++ .../baserow_enterprise/store/assistant.js | 69 ++++++- 15 files changed, 617 insertions(+), 64 deletions(-) diff --git a/enterprise/backend/src/baserow_enterprise/api/assistant/serializers.py b/enterprise/backend/src/baserow_enterprise/api/assistant/serializers.py index 4f78764734..360662c52e 100644 --- a/enterprise/backend/src/baserow_enterprise/api/assistant/serializers.py +++ b/enterprise/backend/src/baserow_enterprise/api/assistant/serializers.py @@ -186,6 +186,20 @@ class ChatTitleMessageSerializer(serializers.Serializer): content = serializers.CharField(help_text="The chat title message content.") +class AiStartedSerializer(serializers.Serializer): + type = serializers.CharField(default=AssistantMessageType.AI_STARTED) + message_id = serializers.CharField( + help_text="The ID of the message being generated." + ) + + +class AiCancelledSerializer(serializers.Serializer): + type = serializers.CharField(default=AssistantMessageType.AI_CANCELLED) + message_id = serializers.CharField( + help_text="The ID of the message that was cancelled." + ) + + class HumanMessageSerializer(serializers.Serializer): id = serializers.IntegerField(help_text="The unique ID of the message.") type = serializers.CharField(default=AssistantMessageType.HUMAN) @@ -203,6 +217,8 @@ class HumanMessageSerializer(serializers.Serializer): AssistantMessageType.AI_REASONING: AiReasoningSerializer, # Show reasoning steps before the final answer AssistantMessageType.AI_NAVIGATION: AiNavigationSerializer, AssistantMessageType.AI_ERROR: AiErrorMessageSerializer, + AssistantMessageType.AI_STARTED: AiStartedSerializer, + AssistantMessageType.AI_CANCELLED: AiCancelledSerializer, } diff --git a/enterprise/backend/src/baserow_enterprise/api/assistant/urls.py b/enterprise/backend/src/baserow_enterprise/api/assistant/urls.py index ed455e1477..81eb5a735f 100644 --- a/enterprise/backend/src/baserow_enterprise/api/assistant/urls.py +++ b/enterprise/backend/src/baserow_enterprise/api/assistant/urls.py @@ -14,6 +14,11 @@ AssistantChatView.as_view(), name="chat_messages", ), + path( + "chat//cancel/", + AssistantChatView.as_view(), + name="cancel_message", + ), path( "chat/", AssistantChatsView.as_view(), diff --git a/enterprise/backend/src/baserow_enterprise/api/assistant/views.py b/enterprise/backend/src/baserow_enterprise/api/assistant/views.py index f693c5dd60..e1b50cee76 100644 --- a/enterprise/backend/src/baserow_enterprise/api/assistant/views.py +++ b/enterprise/backend/src/baserow_enterprise/api/assistant/views.py @@ -24,15 +24,18 @@ from baserow.core.exceptions import UserNotInWorkspace, WorkspaceDoesNotExist from baserow.core.feature_flags import FF_ASSISTANT, feature_flag_is_enabled from baserow.core.handler import CoreHandler +from baserow_enterprise.assistant.assistant import set_assistant_cancellation_key from baserow_enterprise.assistant.exceptions import ( AssistantChatDoesNotExist, AssistantChatMessagePredictionDoesNotExist, + AssistantMessageCancelled, AssistantModelNotSupportedError, ) from baserow_enterprise.assistant.handler import AssistantHandler from baserow_enterprise.assistant.models import AssistantChatPrediction from baserow_enterprise.assistant.operations import ChatAssistantChatOperationType from baserow_enterprise.assistant.types import ( + AiCancelledMessage, AiErrorMessage, AssistantMessageUnion, HumanMessage, @@ -178,6 +181,10 @@ async def stream_assistant_messages(): try: async for msg in assistant.astream_messages(human_message): yield self._stream_assistant_message(msg) + except AssistantMessageCancelled as exc: + yield self._stream_assistant_message( + AiCancelledMessage(message_id=exc.message_id) + ) except Exception: logger.exception("Error while streaming assistant messages") yield self._stream_assistant_message( @@ -239,6 +246,42 @@ def get(self, request: Request, chat_uuid: str) -> Response: return Response(serializer.data) + @extend_schema( + tags=["AI Assistant"], + operation_id="cancel_assistant_message", + description=( + "Cancel an ongoing assistant message generation in the specified chat.\n\n" + ), + responses={ + 204: OpenApiResponse(description="Message generation cancelled"), + 400: get_error_schema(["ERROR_USER_NOT_IN_GROUP"]), + }, + ) + @map_exceptions( + { + UserNotInWorkspace: ERROR_USER_NOT_IN_GROUP, + WorkspaceDoesNotExist: ERROR_GROUP_DOES_NOT_EXIST, + AssistantChatDoesNotExist: ERROR_ASSISTANT_CHAT_DOES_NOT_EXIST, + } + ) + def delete(self, request: Request, chat_uuid: str) -> Response: + feature_flag_is_enabled(FF_ASSISTANT, raise_if_disabled=True) + + handler = AssistantHandler() + chat = handler.get_chat(request.user, chat_uuid) + + workspace = chat.workspace + CoreHandler().check_permissions( + request.user, + ChatAssistantChatOperationType.type, + workspace=workspace, + context=workspace, + ) + + set_assistant_cancellation_key(chat.uuid) + + return Response(status=HTTP_204_NO_CONTENT) + class AssistantChatMessageFeedbackView(APIView): @extend_schema( diff --git a/enterprise/backend/src/baserow_enterprise/assistant/assistant.py b/enterprise/backend/src/baserow_enterprise/assistant/assistant.py index c90f8a46f9..c5bcfa6cd0 100644 --- a/enterprise/backend/src/baserow_enterprise/assistant/assistant.py +++ b/enterprise/backend/src/baserow_enterprise/assistant/assistant.py @@ -3,13 +3,17 @@ from typing import Any, AsyncGenerator, Callable, TypedDict from django.conf import settings +from django.core.cache import cache from django.utils import translation import udspy from udspy.callback import BaseCallback from baserow.api.sessions import get_client_undo_redo_action_group_id -from baserow_enterprise.assistant.exceptions import AssistantModelNotSupportedError +from baserow_enterprise.assistant.exceptions import ( + AssistantMessageCancelled, + AssistantModelNotSupportedError, +) from baserow_enterprise.assistant.tools.navigation.types import AnyNavigationRequestType from baserow_enterprise.assistant.tools.navigation.utils import unsafe_navigate_to from baserow_enterprise.assistant.tools.registries import assistant_tool_registry @@ -21,6 +25,7 @@ AiMessageChunk, AiNavigationMessage, AiReasoningChunk, + AiStartedMessage, AiThinkingMessage, AssistantMessageUnion, ChatTitleMessage, @@ -128,6 +133,29 @@ class ChatSignature(udspy.Signature): answer: str = udspy.OutputField() +def get_assistant_cancellation_key(chat_uuid: str) -> str: + """ + Get the Redis cache key for cancellation tracking. + + :param chat_uuid: The UUID of the assistant chat. + :return: The cache key as a string. + """ + + return f"assistant:chat:{chat_uuid}:cancelled" + + +def set_assistant_cancellation_key(chat_uuid: str, timeout: int = 300) -> None: + """ + Set the cancellation flag in the cache for the given chat UUID. + + :param chat_uuid: The UUID of the assistant chat. + :param timeout: The time in seconds after which the cancellation flag expires. + """ + + cache_key = get_assistant_cancellation_key(chat_uuid) + cache.set(cache_key, True, timeout=timeout) + + class Assistant: def __init__(self, chat: AssistantChat): self._chat = chat @@ -326,6 +354,94 @@ async def _acreate_ai_message_response( can_submit_feedback=True, ) + def _get_cancellation_cache_key(self) -> str: + """ + Get the Redis cache key for cancellation tracking. + + :return: The cache key as a string. + """ + + return get_assistant_cancellation_key(self._chat.uuid) + + def _check_cancellation(self, cache_key: str, message_id: str) -> None: + """ + Check if the message generation has been cancelled. + + :param cache_key: The cache key to check for cancellation. + :param message_id: The ID of the message being generated. + :raises AssistantMessageCancelled: If the message generation has been cancelled. + """ + + if cache.get(cache_key): + cache.delete(cache_key) + raise AssistantMessageCancelled(message_id=message_id) + + async def _enhance_question_with_history(self, question: str) -> str: + """Enhance the user question with chat history context if available.""" + + if not self.history.messages: + return question + + predictor = udspy.Predict("question, context -> enhanced_question") + result = await predictor.aforward( + question=question, context=self.history.messages + ) + return result.enhanced_question + + async def _process_stream_event( + self, + event: Any, + human_msg: AssistantChatMessage, + human_message: HumanMessage, + stream_reasoning: bool, + ) -> tuple[list[AssistantMessageUnion], bool]: + """ + Process a single event from the output stream. + + :param event: The event to process. + :param human_msg: The human message instance. + :param human_message: The human message data. + :param stream_reasoning: Whether reasoning streaming is enabled. + :return: a tuple of (messages_to_yield, updated_stream_reasoning_flag). + """ + + messages = [] + + if isinstance(event, (AiThinkingMessage, AiNavigationMessage)): + messages.append(event) + return messages, True # Enable reasoning streaming + + # Stream the final answer + if isinstance(event, udspy.OutputStreamChunk): + if event.field_name == "answer": + messages.append( + AiMessageChunk( + content=event.content, + sources=self.callbacks.sources, + ) + ) + + elif isinstance(event, udspy.Prediction): + # sub-module predictions contain reasoning steps + if "next_thought" in event and stream_reasoning: + messages.append(AiReasoningChunk(content=event.next_thought)) + + # final prediction contains the answer to the user question + elif event.module is self._assistant: + ai_msg = await self._acreate_ai_message_response( + human_msg, event, self.callbacks.sources + ) + messages.append(ai_msg) + + # Generate chat title if needed + if not self._chat.title: + chat_title = await self._generate_chat_title(human_message, ai_msg) + messages.append(ChatTitleMessage(content=chat_title)) + self._chat.title = chat_title + await self._chat.asave(update_fields=["title", "updated_on"]) + + return messages, stream_reasoning + async def astream_messages( self, human_message: HumanMessage ) -> AsyncGenerator[AssistantMessageUnion, None]: @@ -335,7 +451,6 @@ async def astream_messages( :param human_message: The message from the user. :return: An async generator that yields the response messages. """ - with udspy.settings.context( lm=self._lm_client, callbacks=[*udspy.settings.callbacks, self.callbacks], @@ -343,14 +458,9 @@ async def astream_messages( if self.history is None: await self.aload_chat_history() - user_question = human_message.content - if self.history.messages: # Enhance question context based on chat history - predictor = udspy.Predict("question, context -> enhanced_question") - user_question = ( - await predictor.aforward( - question=user_question, context=self.history.messages - ) - ).enhanced_question + user_question = await self._enhance_question_with_history( + human_message.content + ) output_stream = self._assistant.astream( question=user_question, @@ -361,40 +471,26 @@ async def astream_messages( AssistantChatMessage.Role.HUMAN, human_message.content ) + cache_key = self._get_cancellation_cache_key() + message_id = str(human_msg.id) + yield AiStartedMessage(message_id=message_id) + + # Flag to wait for the first step in the reasoning to start streaming it stream_reasoning = False + chunk_count = 0 + async for event in output_stream: - if isinstance(event, (AiThinkingMessage, AiNavigationMessage)): - # Start streaming reasoning from now on, since we are calling tools - # and updating the UI status - stream_reasoning = True - yield event - continue - - if isinstance(event, udspy.OutputStreamChunk): - # Stream the final answer chunks - if event.field_name == "answer": - yield AiMessageChunk( - content=event.content, - sources=self.callbacks.sources, - ) - continue - - if isinstance(event, udspy.Prediction): - if "next_thought" in event and stream_reasoning: - yield AiReasoningChunk(content=event.next_thought) - - elif event.module is self._assistant: - ai_msg = await self._acreate_ai_message_response( - human_msg, event, self.callbacks.sources - ) - yield ai_msg - - if not self._chat.title: - chat_title = await self._generate_chat_title( - human_message, ai_msg - ) - yield ChatTitleMessage(content=chat_title) - self._chat.title = chat_title - await self._chat.asave( - update_fields=["title", "updated_on"] - ) + # Periodically check for cancellation + chunk_count += 1 + if chunk_count % 10 == 0: + self._check_cancellation(cache_key, message_id) + + messages, stream_reasoning = await self._process_stream_event( + event, human_msg, human_message, stream_reasoning + ) + + if messages: # Don't return responses if cancelled + self._check_cancellation(cache_key, message_id) + + for msg in messages: + yield msg diff --git a/enterprise/backend/src/baserow_enterprise/assistant/exceptions.py b/enterprise/backend/src/baserow_enterprise/assistant/exceptions.py index e5182a79db..db9b79ed4c 100644 --- a/enterprise/backend/src/baserow_enterprise/assistant/exceptions.py +++ b/enterprise/backend/src/baserow_enterprise/assistant/exceptions.py @@ -12,3 +12,15 @@ class AssistantModelNotSupportedError(AssistantException): class AssistantChatMessagePredictionDoesNotExist(AssistantException): pass + + +class AssistantMessageCancelled(AssistantException): + """Raised when a message generation is cancelled by the user.""" + + def __init__(self, message_id: str): + self.message_id = message_id + + def __str__(self): + return ( + f"Message generation for message ID {self.message_id} has been cancelled." + ) diff --git a/enterprise/backend/src/baserow_enterprise/assistant/types.py b/enterprise/backend/src/baserow_enterprise/assistant/types.py index bc99cd30c7..9d6337a055 100644 --- a/enterprise/backend/src/baserow_enterprise/assistant/types.py +++ b/enterprise/backend/src/baserow_enterprise/assistant/types.py @@ -93,11 +93,13 @@ def from_validate_request(cls, request, ui_context_data) -> "UIContext": class AssistantMessageType(StrEnum): HUMAN = "human" - AI_MESSAGE = "ai/message" + AI_STARTED = "ai/started" # Sent when AI starts generating a response AI_THINKING = "ai/thinking" # Update the status bar in the UI - AI_REASONING = "ai/reasoning" # Show reasoning steps before the final answer + AI_REASONING = "ai/reasoning" # Show reasoning as a message before the final answer AI_NAVIGATION = "ai/navigation" + AI_MESSAGE = "ai/message" AI_ERROR = "ai/error" + AI_CANCELLED = "ai/cancelled" # Sent when AI generation is cancelled TOOL_CALL = "tool_call" TOOL = "tool" CHAT_TITLE = "chat/title" @@ -168,6 +170,16 @@ class ChatTitleMessage(BaseModel): content: str = Field(description="The chat title") +class AiStartedMessage(BaseModel): + type: Literal["ai/started"] = AssistantMessageType.AI_STARTED.value + message_id: str = Field(description="The ID of the message being generated") + + +class AiCancelledMessage(BaseModel): + type: Literal["ai/cancelled"] = AssistantMessageType.AI_CANCELLED.value + message_id: str = Field(description="The ID of the message that was cancelled") + + class AiErrorMessageCode(StrEnum): RECURSION_LIMIT_EXCEEDED = "recursion_limit_exceeded" TIMEOUT = "timeout" @@ -183,12 +195,14 @@ class AiErrorMessage(BaseModel): AIMessageUnion = ( - AiMessage + ChatTitleMessage + | AiMessage | AiErrorMessage | AiThinkingMessage - | ChatTitleMessage | AiMessageChunk | AiReasoningChunk + | AiStartedMessage + | AiCancelledMessage ) AssistantMessageUnion = HumanMessage | AIMessageUnion diff --git a/enterprise/backend/tests/baserow_enterprise_tests/api/assistant/test_assistant_views.py b/enterprise/backend/tests/baserow_enterprise_tests/api/assistant/test_assistant_views.py index 4d41473e0f..43f19fe12c 100644 --- a/enterprise/backend/tests/baserow_enterprise_tests/api/assistant/test_assistant_views.py +++ b/enterprise/backend/tests/baserow_enterprise_tests/api/assistant/test_assistant_views.py @@ -2,6 +2,7 @@ from unittest.mock import MagicMock, patch from uuid import uuid4 +from django.core.cache import cache from django.test import override_settings from django.urls import reverse @@ -2120,3 +2121,74 @@ def test_submit_feedback_toggles_sentiment_from_like_to_dislike( prediction.refresh_from_db() assert prediction.human_sentiment == -1 assert prediction.human_feedback == "Changed my mind" + + +@pytest.mark.django_db +@override_settings(DEBUG=True) +def test_cancel_message_sets_redis_flag(api_client, enterprise_data_fixture): + """Test that cancelling a message sets the Redis cancellation flag""" + + user, token = enterprise_data_fixture.create_user_and_token() + workspace = enterprise_data_fixture.create_workspace(user=user) + enterprise_data_fixture.enable_enterprise() + + # Create chat + chat = AssistantChat.objects.create( + user=user, workspace=workspace, title="Test Chat" + ) + + # Call cancel endpoint + rsp = api_client.delete( + reverse("assistant:cancel_message", kwargs={"chat_uuid": chat.uuid}), + HTTP_AUTHORIZATION=f"JWT {token}", + ) + + assert rsp.status_code == 204 + + # Verify Redis flag was set + cache_key = f"assistant:chat:{chat.uuid}:cancelled" + assert cache.get(cache_key) is True + + +@pytest.mark.django_db +@override_settings(DEBUG=True) +def test_cancel_message_requires_auth(api_client, enterprise_data_fixture): + """Test that cancel endpoint requires authentication""" + + user = enterprise_data_fixture.create_user() + workspace = enterprise_data_fixture.create_workspace(user=user) + enterprise_data_fixture.enable_enterprise() + + chat = AssistantChat.objects.create( + user=user, workspace=workspace, title="Test Chat" + ) + + # Call without auth + rsp = api_client.delete( + reverse("assistant:cancel_message", kwargs={"chat_uuid": chat.uuid}), + ) + + assert rsp.status_code == 401 + + +@pytest.mark.django_db +@override_settings(DEBUG=True) +def test_cancel_message_requires_workspace_access(api_client, enterprise_data_fixture): + """Test that user must have access to workspace""" + + user, token = enterprise_data_fixture.create_user_and_token() + other_user = enterprise_data_fixture.create_user() + workspace = enterprise_data_fixture.create_workspace(user=other_user) + enterprise_data_fixture.enable_enterprise() + + chat = AssistantChat.objects.create( + user=other_user, workspace=workspace, title="Test Chat" + ) + + rsp = api_client.delete( + reverse("assistant:cancel_message", kwargs={"chat_uuid": chat.uuid}), + HTTP_AUTHORIZATION=f"JWT {token}", + ) + + assert rsp.status_code == 404 + assert rsp.json()["error"] == "ERROR_ASSISTANT_CHAT_DOES_NOT_EXIST" diff --git a/enterprise/backend/tests/baserow_enterprise_tests/assistant/test_assistant.py b/enterprise/backend/tests/baserow_enterprise_tests/assistant/test_assistant.py index 462d5746ca..617d9df68c 100644 --- a/enterprise/backend/tests/baserow_enterprise_tests/assistant/test_assistant.py +++ b/enterprise/backend/tests/baserow_enterprise_tests/assistant/test_assistant.py @@ -10,14 +10,18 @@ """ from unittest.mock import MagicMock, patch +from django.core.cache import cache + import pytest from asgiref.sync import async_to_sync from udspy import OutputStreamChunk, Prediction from baserow_enterprise.assistant.assistant import Assistant, AssistantCallbacks +from baserow_enterprise.assistant.exceptions import AssistantMessageCancelled from baserow_enterprise.assistant.models import AssistantChat, AssistantChatMessage from baserow_enterprise.assistant.types import ( AiMessageChunk, + AiStartedMessage, AiThinkingMessage, ApplicationUIContext, ChatTitleMessage, @@ -831,3 +835,160 @@ def test_user_ui_context_from_user(self, enterprise_data_fixture): assert user_context.id == user.id assert user_context.name == "John Doe" assert user_context.email == "john@example.com" + + +@pytest.mark.django_db +class TestAssistantCancellation: + """Test cancellation functionality in Assistant""" + + def test_get_cancellation_cache_key(self, enterprise_data_fixture): + """Test that cancellation cache key is correctly formatted""" + + user = enterprise_data_fixture.create_user() + workspace = enterprise_data_fixture.create_workspace(user=user) + chat = AssistantChat.objects.create( + user=user, workspace=workspace, title="Test" + ) + + assistant = Assistant(chat) + cache_key = assistant._get_cancellation_cache_key() + + assert cache_key == f"assistant:chat:{chat.uuid}:cancelled" + + def test_check_cancellation_raises_when_flag_set(self, enterprise_data_fixture): + """Test that check_cancellation raises exception when flag is set""" + + user = enterprise_data_fixture.create_user() + workspace = enterprise_data_fixture.create_workspace(user=user) + chat = AssistantChat.objects.create( + user=user, workspace=workspace, title="Test" + ) + + assistant = Assistant(chat) + cache_key = assistant._get_cancellation_cache_key() + + # Set cancellation flag + cache.set(cache_key, True) + + # Should raise exception + with pytest.raises(AssistantMessageCancelled) as exc_info: + assistant._check_cancellation(cache_key, "msg123") + + assert exc_info.value.message_id == "msg123" + + # Flag should be cleaned up + assert cache.get(cache_key) is None + + def test_check_cancellation_does_nothing_when_no_flag( + self, enterprise_data_fixture + ): + """Test that check_cancellation does nothing when flag not set""" + + user = enterprise_data_fixture.create_user() + workspace = enterprise_data_fixture.create_workspace(user=user) + chat = AssistantChat.objects.create( + user=user, workspace=workspace, title="Test" + ) + + assistant = Assistant(chat) + cache_key = assistant._get_cancellation_cache_key() + + # Should not raise + assistant._check_cancellation(cache_key, "msg123") + + @patch("udspy.ReAct.astream") + @patch("udspy.LM") + def test_astream_messages_yields_ai_started_message( + self, mock_lm, mock_astream, enterprise_data_fixture + ): + """Test that astream_messages yields AiStartedMessage at the beginning""" + + user = enterprise_data_fixture.create_user() + workspace = enterprise_data_fixture.create_workspace(user=user) + chat = AssistantChat.objects.create( + user=user, workspace=workspace, title="Test" + ) + + # Mock the streaming + async def mock_stream(*args, **kwargs): + yield OutputStreamChunk( + module=None, + field_name="answer", + delta="Hello", + content="Hello", + is_complete=False, + ) + yield Prediction(answer="Hello there!", trajectory=[], reasoning="") + + mock_astream.return_value = mock_stream() + mock_lm.return_value.model = "test-model" + + assistant = Assistant(chat) + ui_context = UIContext( + workspace=WorkspaceUIContext(id=workspace.id, name=workspace.name), + user=UserUIContext(id=user.id, name=user.first_name, email=user.email), + ) + human_message = HumanMessage(content="Hello", ui_context=ui_context) + + # Collect messages + async def collect_messages(): + messages = [] + async for msg in assistant.astream_messages(human_message): + messages.append(msg) + return messages + + messages = async_to_sync(collect_messages)() + + # First message should be AiStartedMessage + assert len(messages) > 0 + assert isinstance(messages[0], AiStartedMessage) + assert messages[0].message_id is not None + + @patch("udspy.ReAct.astream") + @patch("udspy.LM") + def test_astream_messages_checks_cancellation_periodically( + self, mock_lm, mock_astream, enterprise_data_fixture + ): + """Test that astream_messages checks for cancellation every 10 chunks""" + + user = enterprise_data_fixture.create_user() + workspace = enterprise_data_fixture.create_workspace(user=user) + chat = AssistantChat.objects.create( + user=user, workspace=workspace, title="Test" + ) + + # Mock the stream to return many chunks - enough to trigger check at 10 + async def mock_stream(*args, **kwargs): + # Yield 15 chunks - cancellation check happens at chunk 10 + for i in range(15): + yield OutputStreamChunk( + module=None, + field_name="answer", + delta=f"word{i}", + content=f"word{i}", + is_complete=False, + ) + yield Prediction(answer="Complete response", trajectory=[], reasoning="") + + mock_astream.return_value = mock_stream() + mock_lm.return_value.model = "test-model" + + assistant = Assistant(chat) + cache_key = assistant._get_cancellation_cache_key() + + # Set cancellation flag immediately - it should be detected at chunk 10 + cache.set(cache_key, True) + + ui_context = UIContext( + workspace=WorkspaceUIContext(id=workspace.id, name=workspace.name), + user=UserUIContext(id=user.id, name=user.first_name, email=user.email), + ) + human_message = HumanMessage(content="Hello", ui_context=ui_context) + + # Should raise AssistantMessageCancelled when check happens at chunk 10 + async def stream_messages(): + async for msg in assistant.astream_messages(human_message): + pass + + with pytest.raises(AssistantMessageCancelled): + async_to_sync(stream_messages)() diff --git a/enterprise/web-frontend/modules/baserow_enterprise/assets/scss/components/assistant.scss b/enterprise/web-frontend/modules/baserow_enterprise/assets/scss/components/assistant.scss index 1a539e4a18..5f0c9fc65b 100644 --- a/enterprise/web-frontend/modules/baserow_enterprise/assets/scss/components/assistant.scss +++ b/enterprise/web-frontend/modules/baserow_enterprise/assets/scss/components/assistant.scss @@ -266,10 +266,6 @@ font-size: 14px; } - &--is-running i { - animation: spin 2.5s linear infinite; - } - &:hover:not(.assistant__send-button--disabled) { background: $palette-neutral-1200; transform: scale(1.05); @@ -757,3 +753,8 @@ text-align: left; line-height: 1.4; } + +.assistant__send-button-icon-stop { + background-color: white; + transform: scale(0.7); +} diff --git a/enterprise/web-frontend/modules/baserow_enterprise/components/assistant/AssistantInputMessage.vue b/enterprise/web-frontend/modules/baserow_enterprise/components/assistant/AssistantInputMessage.vue index 46628bbc61..045cc24e3c 100644 --- a/enterprise/web-frontend/modules/baserow_enterprise/components/assistant/AssistantInputMessage.vue +++ b/enterprise/web-frontend/modules/baserow_enterprise/components/assistant/AssistantInputMessage.vue @@ -27,15 +27,20 @@ class="assistant__send-button" :class="{ 'assistant__send-button--disabled': - !currentMessage.trim() || isRunning, + (!currentMessage.trim() && !isRunning) || isCancelling, 'assistant__send-button--is-running': isRunning, + 'assistant__send-button--is-cancelling': isCancelling, }" - :disabled="!currentMessage.trim() || isRunning" - :title="$t('assistantInputMessage.send')" - @click="sendMessage" + :disabled="(!currentMessage.trim() && !isRunning) || isCancelling" + :title=" + isRunning + ? $t('assistantInputMessage.stop') + : $t('assistantInputMessage.send') + " + @click="handleButtonClick" > - + @@ -59,6 +64,10 @@ export default { type: Boolean, default: false, }, + isCancelling: { + type: Boolean, + default: false, + }, runningMessage: { type: String, default: '', @@ -80,6 +89,15 @@ export default { // If shift key is pressed, allow the default behavior (new line) if (!event.shiftKey) { event.preventDefault() + if (!this.isRunning) { + this.sendMessage() + } + } + }, + handleButtonClick() { + if (this.isRunning) { + this.cancelMessage() + } else { this.sendMessage() } }, @@ -91,6 +109,10 @@ export default { this.clear() }, + cancelMessage() { + if (!this.isRunning || this.isCancelling) return + this.$emit('cancel-message') + }, calculateLineHeight() { const textarea = this.$refs.textarea const computedStyle = window.getComputedStyle(textarea) diff --git a/enterprise/web-frontend/modules/baserow_enterprise/components/assistant/AssistantMessageList.vue b/enterprise/web-frontend/modules/baserow_enterprise/components/assistant/AssistantMessageList.vue index 12effaf6bc..edf716078b 100644 --- a/enterprise/web-frontend/modules/baserow_enterprise/components/assistant/AssistantMessageList.vue +++ b/enterprise/web-frontend/modules/baserow_enterprise/components/assistant/AssistantMessageList.vue @@ -8,6 +8,7 @@ 'assistant__message--human': message.role === 'human', 'assistant__message--ai': message.role === 'ai', 'assistant__message--error': message.error, + 'assistant__message--cancelled': message.cancelled, 'assistant__message--reasoning': message.reasoning, }" > diff --git a/enterprise/web-frontend/modules/baserow_enterprise/components/assistant/AssistantPanel.vue b/enterprise/web-frontend/modules/baserow_enterprise/components/assistant/AssistantPanel.vue index d5454a8c1e..43f7b1bf5b 100644 --- a/enterprise/web-frontend/modules/baserow_enterprise/components/assistant/AssistantPanel.vue +++ b/enterprise/web-frontend/modules/baserow_enterprise/components/assistant/AssistantPanel.vue @@ -52,8 +52,10 @@ @@ -105,6 +107,9 @@ export default { isAssistantRunning() { return Boolean(this.currentChat?.running) }, + isAssistantCancelling() { + return Boolean(this.currentChat?.cancelling) + }, assistantRunningMessage() { return this.currentChat?.runningMessage || '' }, @@ -241,6 +246,7 @@ export default { methods: { ...mapActions({ sendMessage: 'assistant/sendMessage', + cancelMessage: 'assistant/cancelMessage', createChat: 'assistant/createChat', selectChat: 'assistant/selectChat', clearChat: 'assistant/clearChat', @@ -258,6 +264,10 @@ export default { }) }, + async handleCancelMessage() { + await this.cancelMessage() + }, + toggleChatHistoryContext() { this.$refs.chatHistory.toggle( this.$refs.chatHistoryButton, diff --git a/enterprise/web-frontend/modules/baserow_enterprise/locales/en.json b/enterprise/web-frontend/modules/baserow_enterprise/locales/en.json index c6863d77ef..40c1fb5902 100644 --- a/enterprise/web-frontend/modules/baserow_enterprise/locales/en.json +++ b/enterprise/web-frontend/modules/baserow_enterprise/locales/en.json @@ -337,11 +337,14 @@ "statusWaiting": "Assistant is ready to help", "statusRunning": "Running...", "placeholder": "Ask me anything...", - "send": "Send message" + "send": "Send message", + "stop": "Stop generation" }, "assistant": { "statusThinking": "Thinking...", - "statusAnswering": "Answering..." + "statusAnswering": "Answering...", + "statusCancelling": "Cancelling...", + "messageCancelled": "Message cancelled" }, "assistantChatHistoryContext": { "empty": "No chat history available", diff --git a/enterprise/web-frontend/modules/baserow_enterprise/services/assistant.js b/enterprise/web-frontend/modules/baserow_enterprise/services/assistant.js index c17319ecc1..8b38abed43 100644 --- a/enterprise/web-frontend/modules/baserow_enterprise/services/assistant.js +++ b/enterprise/web-frontend/modules/baserow_enterprise/services/assistant.js @@ -9,6 +9,9 @@ function getAssistantBaseURL(client) { } export default (client) => { + // Store active XHR request by chat UUID for cancellation + const activeRequests = new Map() + return { async sendMessage(chatUuid, message, uiContext, onDownloadProgress = null) { return await client.post( @@ -24,6 +27,9 @@ export default (client) => { const xhr = new XMLHttpRequest() let buffer = '' + // Store XHR for potential cancellation + activeRequests.set(chatUuid, xhr) + xhr.open('POST', config.baseURL + config.url, true) Object.keys(config.headers).forEach((key) => { xhr.setRequestHeader(key, config.headers[key]) @@ -45,6 +51,9 @@ export default (client) => { } xhr.onload = () => { + // Clean up stored XHR reference + activeRequests.delete(chatUuid) + // Check if the request was successful (2xx status codes) if (xhr.status >= 200 && xhr.status < 300) { resolve({ data: xhr.responseText, status: xhr.status }) @@ -76,17 +85,30 @@ export default (client) => { } xhr.onerror = () => { + // Clean up stored XHR reference + activeRequests.delete(chatUuid) const error = new Error('Network error occurred') error.isAxiosError = true reject(error) } xhr.ontimeout = () => { + // Clean up stored XHR reference + activeRequests.delete(chatUuid) const error = new Error('Request timeout') error.isAxiosError = true reject(error) } + xhr.onabort = () => { + // Clean up stored XHR reference + activeRequests.delete(chatUuid) + const error = new Error('Request cancelled') + error.isAxiosError = true + error.cancelled = true + reject(error) + } + xhr.send(config.data) }) }, @@ -124,5 +146,19 @@ export default (client) => { ) return data }, + + async cancelMessage(chatUuid) { + await client.delete(`/assistant/chat/${chatUuid}/cancel/`, { + baseURL: getAssistantBaseURL(client), + }) + + // Abort the XHR request if it exists + const xhr = activeRequests.get(chatUuid) + if (xhr) { + // Optionally, set a custom property to indicate user-initiated abort + xhr._userCancelled = true + xhr.abort() + } + }, } } diff --git a/enterprise/web-frontend/modules/baserow_enterprise/store/assistant.js b/enterprise/web-frontend/modules/baserow_enterprise/store/assistant.js index 2d97705f8a..23fdce3aa1 100644 --- a/enterprise/web-frontend/modules/baserow_enterprise/store/assistant.js +++ b/enterprise/web-frontend/modules/baserow_enterprise/store/assistant.js @@ -3,12 +3,14 @@ import { v4 as uuidv4 } from 'uuid' import Vue from 'vue' const MESSAGE_TYPE = { - MESSAGE: 'ai/message', + MESSAGE: 'ai/message', // The main AI message content, both for partial and final answers THINKING: 'ai/thinking', // Update the status bar in the UI REASONING: 'ai/reasoning', // Show reasoning steps before the final answer - NAVIGATION: 'ai/navigation', - ERROR: 'ai/error', - CHAT_TITLE: 'chat/title', + NAVIGATION: 'ai/navigation', // Navigate the user to a specific location in the UI + ERROR: 'ai/error', // Show an error message + CHAT_TITLE: 'chat/title', // Update the chat title + AI_STARTED: 'ai/started', // Indicates the AI started generating a response + AI_CANCELLED: 'ai/cancelled', // Indicates the AI generation was cancelled } export const state = () => ({ @@ -36,6 +38,10 @@ export const mutations = { Vue.set(chat, 'runningMessage', message) }, + SET_ASSISTANT_CANCELLING(state, { chat, value }) { + Vue.set(chat, 'cancelling', value) + }, + SET_MESSAGES(state, messages) { state.messages = messages }, @@ -61,6 +67,10 @@ export const mutations = { state.messages = [] }, + SET_CURRENT_MESSAGE_ID(state, { chat, messageId }) { + Vue.set(chat, 'currentMessageId', messageId) + }, + SET_CHATS(state, chats) { state.chats = chats.map((chat) => ({ id: chat.uuid, @@ -71,6 +81,8 @@ export const mutations = { loading: false, running: false, reasoning: false, + cancelling: false, + currentMessageId: null, })) }, @@ -158,6 +170,24 @@ export const actions = { handleStreamingResponse({ commit, state }, { chat, id, update }) { switch (update.type) { + case MESSAGE_TYPE.AI_STARTED: + commit('SET_CURRENT_MESSAGE_ID', { chat, messageId: update.message_id }) + break + case MESSAGE_TYPE.AI_CANCELLED: + commit('UPDATE_MESSAGE', { + id, + updates: { + content: this.$i18n.t('assistant.messageCancelled'), + loading: false, + error: false, + reasoning: false, + cancelled: true, + }, + }) + commit('SET_ASSISTANT_CANCELLING', { chat, value: false }) + commit('SET_ASSISTANT_RUNNING', { chat, value: false }) + commit('SET_CURRENT_MESSAGE_ID', { chat, messageId: null }) + break case MESSAGE_TYPE.MESSAGE: commit('SET_ASSISTANT_RUNNING_MESSAGE', { chat, @@ -270,6 +300,10 @@ export const actions = { throw new Error('The assistant did not provide a response.') } } catch (error) { + // Don't show error if the request was cancelled by user + if (error.cancelled) { + return + } commit('UPDATE_MESSAGE', { id: aiMessageId, updates: { @@ -284,8 +318,35 @@ export const actions = { }) } finally { commit('SET_ASSISTANT_RUNNING', { chat, value: false }) + commit('SET_CURRENT_MESSAGE_ID', { chat, messageId: null }) } }, + + async cancelMessage({ commit, state }) { + if (!state.currentChatId) { + return + } + + const chat = state.chats.find((c) => c.id === state.currentChatId) + if (!chat || !chat.running) { + return + } + + commit('SET_ASSISTANT_CANCELLING', { chat, value: true }) + commit('SET_ASSISTANT_RUNNING_MESSAGE', { + chat, + message: this.$i18n.t('assistant.statusCancelling'), + }) + + try { + await assistant(this.$client).cancelMessage(state.currentChatId) + } catch (error) { + commit('SET_ASSISTANT_CANCELLING', { chat, value: false }) + commit('SET_ASSISTANT_RUNNING', { chat, value: false }) + commit('SET_CURRENT_MESSAGE_ID', { chat, messageId: null }) + } + }, + async submitFeedback({ commit, state }, { messageId, sentiment, feedback }) { const message = state.messages.find((m) => m.id === messageId) if (!message) { From addfa31652425d7300173a4eb1b5cb36d9ca1b7b Mon Sep 17 00:00:00 2001 From: Davide Silvestri <75379892+silvestrid@users.noreply.github.com> Date: Fri, 14 Nov 2025 11:34:47 +0100 Subject: [PATCH 05/13] feat(AI Assistant): create Slack write message node (#4245) --- .../assistant/tools/automation/types/node.py | 70 ++++++++++++------- .../services/SlackWriteMessageServiceForm.vue | 2 - 2 files changed, 46 insertions(+), 26 deletions(-) diff --git a/enterprise/backend/src/baserow_enterprise/assistant/tools/automation/types/node.py b/enterprise/backend/src/baserow_enterprise/assistant/tools/automation/types/node.py index d70816774b..1c4b916eb2 100644 --- a/enterprise/backend/src/baserow_enterprise/assistant/tools/automation/types/node.py +++ b/enterprise/backend/src/baserow_enterprise/assistant/tools/automation/types/node.py @@ -7,7 +7,10 @@ from pydantic import Field, PrivateAttr from baserow.contrib.automation.nodes.models import AutomationNode -from baserow.core.formula.types import BASEROW_FORMULA_MODE_ADVANCED +from baserow.core.formula.types import ( + BASEROW_FORMULA_MODE_ADVANCED, + BaserowFormulaObject, +) from baserow.core.services.handler import ServiceHandler from baserow.core.services.models import Service from baserow_enterprise.assistant.types import BaseModel @@ -45,16 +48,18 @@ def get_formulas_to_create(self, orm_node: AutomationNode) -> dict[str, str]: pass - @abstractmethod def update_service_with_formulas(self, service: Service, formulas: dict[str, str]): - """ - Updates the given service instance with the provided formulas mapping. - The names in the formulas dict correspond to the field names returned by - get_formulas_to_create. Once the LLM has generated the formulas, this method - is called to update the service with the generated formulas. - """ - - pass + save = False + for field_name, formula in formulas.items(): + if hasattr(service, field_name): + setattr( + service, + field_name, + BaserowFormulaObject.create(formula=formula), + ) + save = True + if save: + ServiceHandler().update_service(service.get_type(), service) class PeriodicTriggerSettings(BaseModel): @@ -312,20 +317,41 @@ def get_formulas_to_create(self, orm_node: AutomationNode) -> dict[str, str]: values["body"] += f" Value to resolve: {self.body}" return values - def update_service_with_formulas(self, service: Service, formulas: dict[str, str]): - save = False - for field_name, formula in formulas.items(): - if hasattr(service, field_name): - setattr(service, field_name, formula) - save = True - if save: - ServiceHandler().update_service(service.get_type(), service) - class SendEmailActionItem(SendEmailActionBase, Item): """Existing send email action with ID.""" +class SlackWriteMessageActionBase(NodeBase): + """Send Slack message action configuration.""" + + type: Literal["slack_write_message"] + channel: str + text: str + + +class SlackWriteMessageActionCreate( + SlackWriteMessageActionBase, RefCreate, EdgeCreate, HasFormulasToCreateMixin +): + """Create a send Slack message action with edge configuration.""" + + def to_orm_service_dict(self) -> dict[str, Any]: + return { + "channel": self.channel, + "text": f"'{self.text}'", + } + + def get_formulas_to_create(self, orm_node: AutomationNode) -> dict[str, str]: + values = {} + + message_base = "The message content." + if self.text: + values["text"] = message_base + f" Value to resolve: '{self.text}'" + else: + values["text"] = "[optional]: " + message_base + return values + + class CreateRowActionBase(NodeBase): """Create row action configuration.""" @@ -486,11 +512,6 @@ def to_orm_service_dict(self) -> dict[str, Any]: def get_formulas_to_create(self, orm_node: AutomationNode) -> dict[str, str]: return {"ai_prompt": self.prompt} - def update_service_with_formulas(self, service: Service, formulas: dict[str, str]): - if "ai_prompt" in formulas: - service.ai_prompt = formulas["ai_prompt"] - ServiceHandler().update_service(service.get_type(), service) - class AiAgentNodeItem(AiAgentNodeBase, Item): """Existing AI Agent action with ID.""" @@ -500,6 +521,7 @@ class AiAgentNodeItem(AiAgentNodeBase, Item): RouterNodeCreate # actions | SendEmailActionCreate + | SlackWriteMessageActionCreate | CreateRowActionCreate | UpdateRowActionCreate | DeleteRowActionCreate diff --git a/web-frontend/modules/integrations/slack/components/services/SlackWriteMessageServiceForm.vue b/web-frontend/modules/integrations/slack/components/services/SlackWriteMessageServiceForm.vue index f038348efb..7f6a71328c 100644 --- a/web-frontend/modules/integrations/slack/components/services/SlackWriteMessageServiceForm.vue +++ b/web-frontend/modules/integrations/slack/components/services/SlackWriteMessageServiceForm.vue @@ -17,7 +17,6 @@ /> Date: Fri, 14 Nov 2025 11:51:28 +0100 Subject: [PATCH 06/13] feat(AI field): generate all table/view values at once (#4206) * initial work to move ai values generation inside a job * UI for regenerating all AI field cell values at once * working version * Adding tests * Add changelog entry * Fix tests, apply copilot sensible suggestions * address bugs from feedback * Remove old test: we are setting values to None now when a single select is deleted --------- Co-authored-by: Przemyslaw Kukulski --- .../baserow/contrib/database/rows/handler.py | 4 +- backend/src/baserow/core/jobs/handler.py | 23 +- backend/src/baserow/core/jobs/registries.py | 27 +- .../field/test_single_select_field_type.py | 44 - ...all_tableview_ai_field_values_at_once.json | 8 + .../src/baserow_premium/api/fields/views.py | 34 +- premium/backend/src/baserow_premium/apps.py | 7 +- .../src/baserow_premium/fields/field_types.py | 6 +- .../src/baserow_premium/fields/job_types.py | 336 ++++++ .../src/baserow_premium/fields/models.py | 45 + .../src/baserow_premium/fields/tasks.py | 141 --- .../migrations/0030_generateaivaluesjob.py | 98 ++ .../api/fields/test_ai_field_views.py | 30 +- .../fields/test_ai_field_output_types.py | 10 +- .../fields/test_ai_field_tasks.py | 510 --------- .../test_generate_ai_values_job_execution.py | 352 +++++++ .../test_generate_ai_values_job_type.py | 968 ++++++++++++++++++ .../field/GenerateAIValuesContextItem.vue | 102 ++ .../components/field/GenerateAIValuesForm.vue | 119 +++ .../field/GenerateAIValuesFormFooter.vue | 58 ++ .../field/GenerateAIValuesModal.vue | 152 +++ .../components/row/RowEditFieldAI.vue | 5 +- .../views/grid/fields/GridViewFieldAI.vue | 5 +- .../baserow_premium/fieldContextItemTypes.js | 12 + .../modules/baserow_premium/jobTypes.js | 16 + .../modules/baserow_premium/locales/en.json | 17 + .../modules/baserow_premium/plugin.js | 10 + .../modules/baserow_premium/services/field.js | 19 + .../scss/components/modal-progress.scss | 8 +- web-frontend/modules/database/locales/en.json | 1 + 30 files changed, 2403 insertions(+), 764 deletions(-) create mode 100644 changelog/entries/unreleased/feature/2586_regenerate_all_tableview_ai_field_values_at_once.json create mode 100644 premium/backend/src/baserow_premium/fields/job_types.py delete mode 100644 premium/backend/src/baserow_premium/fields/tasks.py create mode 100644 premium/backend/src/baserow_premium/migrations/0030_generateaivaluesjob.py delete mode 100644 premium/backend/tests/baserow_premium_tests/fields/test_ai_field_tasks.py create mode 100644 premium/backend/tests/baserow_premium_tests/fields/test_generate_ai_values_job_execution.py create mode 100644 premium/backend/tests/baserow_premium_tests/fields/test_generate_ai_values_job_type.py create mode 100644 premium/web-frontend/modules/baserow_premium/components/field/GenerateAIValuesContextItem.vue create mode 100644 premium/web-frontend/modules/baserow_premium/components/field/GenerateAIValuesForm.vue create mode 100644 premium/web-frontend/modules/baserow_premium/components/field/GenerateAIValuesFormFooter.vue create mode 100644 premium/web-frontend/modules/baserow_premium/components/field/GenerateAIValuesModal.vue create mode 100644 premium/web-frontend/modules/baserow_premium/fieldContextItemTypes.js create mode 100644 premium/web-frontend/modules/baserow_premium/jobTypes.js diff --git a/backend/src/baserow/contrib/database/rows/handler.py b/backend/src/baserow/contrib/database/rows/handler.py index ade2eeac43..dd71d6d6e8 100644 --- a/backend/src/baserow/contrib/database/rows/handler.py +++ b/backend/src/baserow/contrib/database/rows/handler.py @@ -2503,13 +2503,13 @@ def _extract_field_ids_from_row_values( def get_rows( self, model: GeneratedTableModel, row_ids: List[int] - ) -> List[GeneratedTableModel]: + ) -> QuerySet[GeneratedTableModel]: """ Returns a list of rows based on the provided row ids. :param model: The model that should be used to get the rows. :param row_ids: The list of row ids that should be fetched. - :return: The list of rows. + :return: A queryset of the fetched rows. """ return model.objects.filter(id__in=row_ids).enhance_by_fields() diff --git a/backend/src/baserow/core/jobs/handler.py b/backend/src/baserow/core/jobs/handler.py index 1eeb9bb74b..b28fce3eb4 100644 --- a/backend/src/baserow/core/jobs/handler.py +++ b/backend/src/baserow/core/jobs/handler.py @@ -8,12 +8,7 @@ from baserow.core.utils import Progress -from .exceptions import ( - JobCancelled, - JobDoesNotExist, - JobNotCancellable, - MaxJobCountExceeded, -) +from .exceptions import JobCancelled, JobDoesNotExist, JobNotCancellable from .models import Job from .registries import job_type_registry from .signals import job_started @@ -179,20 +174,10 @@ def create_and_start_job( job_type = job_type_registry.get(job_type_name) model_class = job_type.model_class - - # Check how many job of same type are running simultaneously. If count > max - # we don't want to create a new one. - running_jobs = model_class.objects.filter( - user_id=user.id - ).is_pending_or_running() - if len(running_jobs) >= job_type.max_count: - raise MaxJobCountExceeded( - f"You can only launch {job_type.max_count} {job_type_name} job(s) at " - "the same time." - ) - job_values = job_type.prepare_values(kwargs, user) - job: AnyJob = model_class.objects.create(user=user, **job_values) + job: AnyJob = model_class(user=user, **job_values) + job_type.can_schedule_or_raise(job) + job.save() job_type.after_job_creation(job, kwargs) if sync: diff --git a/backend/src/baserow/core/jobs/registries.py b/backend/src/baserow/core/jobs/registries.py index 10514e55ef..97ffd28c15 100644 --- a/backend/src/baserow/core/jobs/registries.py +++ b/backend/src/baserow/core/jobs/registries.py @@ -18,7 +18,11 @@ from baserow.core.telemetry.utils import baserow_trace_methods from baserow.core.utils import Progress -from .exceptions import JobTypeAlreadyRegistered, JobTypeDoesNotExist +from .exceptions import ( + JobTypeAlreadyRegistered, + JobTypeDoesNotExist, + MaxJobCountExceeded, +) from .models import Job from .types import AnyJob @@ -52,6 +56,27 @@ class JobType( A number of max jobs count for the same type for a given user. """ + def can_schedule_or_raise(self, job: Job) -> None: + """ + This method can be overridden to add custom logic to check if the given user + can schedule a job of this type. + + :param job: The job instance that is going to be scheduled. + :raises MaxJobCountExceeded: If the user cannot schedule a new job of this type. + """ + + # Check how many job of same type are running simultaneously. If count > max + # we don't want to create a new one. + running_jobs = job.__class__.objects.filter( + user_id=job.user.id + ).is_pending_or_running() + + if len(running_jobs) >= self.max_count: + raise MaxJobCountExceeded( + f"You can only launch {self.max_count} {self.type} job(s) at " + "the same time." + ) + def transaction_atomic_context(self, job: Job): """ This method gives the possibility to change the transaction context per request. diff --git a/backend/tests/baserow/contrib/database/field/test_single_select_field_type.py b/backend/tests/baserow/contrib/database/field/test_single_select_field_type.py index b7014e50e4..6138706336 100644 --- a/backend/tests/baserow/contrib/database/field/test_single_select_field_type.py +++ b/backend/tests/baserow/contrib/database/field/test_single_select_field_type.py @@ -1026,50 +1026,6 @@ def test_get_set_export_serialized_value_single_select_field(data_fixture): assert getattr(imported_row_3, f"field_{imported_field.id}").color == "red" -@pytest.mark.django_db(transaction=True) -def test_get_set_export_serialized_value_single_select_field_with_deleted_option( - data_fixture, -): - user = data_fixture.create_user() - workspace = data_fixture.create_workspace(user=user) - imported_workspace = data_fixture.create_workspace(user=user) - database = data_fixture.create_database_application(workspace=workspace) - table = data_fixture.create_database_table(database=database) - field = data_fixture.create_single_select_field(table=table) - option_a = data_fixture.create_select_option(field=field, value="A", color="green") - - core_handler = CoreHandler() - - model = table.get_model() - model.objects.create(**{f"field_{field.id}_id": option_a.id}) - - # Deleting the option doesn't set the row value to None. - option_a.delete() - - config = ImportExportConfig(include_permission_data=False) - - exported_applications = core_handler.export_workspace_applications( - workspace, BytesIO(), config - ) - imported_applications, id_mapping = core_handler.import_applications_to_workspace( - imported_workspace, exported_applications, BytesIO(), config, None - ) - imported_database = imported_applications[0] - imported_table = imported_database.table_set.all()[0] - imported_field = imported_table.field_set.all().first().specific - - assert imported_table.id != table.id - assert imported_field.id != field.id - - imported_model = imported_table.get_model() - all = imported_model.objects.all() - assert len(all) == 1 - imported_row_1 = all[0] - - assert getattr(imported_row_1, f"field_{imported_field.id}") is None - assert getattr(imported_row_1, f"field_{imported_field.id}_id") is None - - @pytest.mark.django_db def test_single_select_adjacent_row(data_fixture): user = data_fixture.create_user() diff --git a/changelog/entries/unreleased/feature/2586_regenerate_all_tableview_ai_field_values_at_once.json b/changelog/entries/unreleased/feature/2586_regenerate_all_tableview_ai_field_values_at_once.json new file mode 100644 index 0000000000..2576ddcbe7 --- /dev/null +++ b/changelog/entries/unreleased/feature/2586_regenerate_all_tableview_ai_field_values_at_once.json @@ -0,0 +1,8 @@ +{ + "type": "feature", + "message": " Regenerate all table/view AI field values at once ", + "domain": "database", + "issue_number": 2586, + "bullet_points": [], + "created_at": "2025-11-13" +} \ No newline at end of file diff --git a/premium/backend/src/baserow_premium/api/fields/views.py b/premium/backend/src/baserow_premium/api/fields/views.py index 119f234009..4271fd5bd3 100644 --- a/premium/backend/src/baserow_premium/api/fields/views.py +++ b/premium/backend/src/baserow_premium/api/fields/views.py @@ -1,8 +1,8 @@ from django.db import transaction from baserow_premium.fields.actions import GenerateFormulaWithAIActionType +from baserow_premium.fields.job_types import GenerateAIValuesJobType from baserow_premium.fields.models import AIField -from baserow_premium.fields.tasks import generate_ai_values_for_rows from baserow_premium.license.features import PREMIUM from baserow_premium.license.handler import LicenseHandler from drf_spectacular.openapi import OpenApiParameter, OpenApiTypes @@ -22,6 +22,7 @@ ERROR_MODEL_DOES_NOT_BELONG_TO_TYPE, ERROR_OUTPUT_PARSER, ) +from baserow.api.jobs.serializers import JobSerializer from baserow.api.schemas import ( CLIENT_SESSION_ID_SCHEMA_PARAMETER, CLIENT_UNDO_REDO_ACTION_GROUP_ID_SCHEMA_PARAMETER, @@ -30,13 +31,14 @@ from baserow.contrib.database.api.fields.errors import ERROR_FIELD_DOES_NOT_EXIST from baserow.contrib.database.api.rows.errors import ERROR_ROW_DOES_NOT_EXIST from baserow.contrib.database.api.tables.errors import ERROR_TABLE_DOES_NOT_EXIST +from baserow.contrib.database.api.views.errors import ERROR_VIEW_DOES_NOT_EXIST from baserow.contrib.database.fields.exceptions import FieldDoesNotExist from baserow.contrib.database.fields.handler import FieldHandler from baserow.contrib.database.fields.operations import ListFieldsOperationType from baserow.contrib.database.rows.exceptions import RowDoesNotExist -from baserow.contrib.database.rows.handler import RowHandler from baserow.contrib.database.table.exceptions import TableDoesNotExist from baserow.contrib.database.table.handler import TableHandler +from baserow.contrib.database.views.exceptions import ViewDoesNotExist from baserow.core.action.registries import action_type_registry from baserow.core.exceptions import UserNotInWorkspace from baserow.core.generative_ai.exceptions import ( @@ -44,8 +46,9 @@ GenerativeAITypeDoesNotExist, ModelDoesNotBelongToType, ) -from baserow.core.generative_ai.registries import generative_ai_model_type_registry from baserow.core.handler import CoreHandler +from baserow.core.jobs.handler import JobHandler +from baserow.core.jobs.registries import job_type_registry from .serializers import ( GenerateAIFieldValueViewSerializer, @@ -101,6 +104,7 @@ class AsyncGenerateAIFieldValuesView(APIView): UserNotInWorkspace: ERROR_USER_NOT_IN_GROUP, GenerativeAITypeDoesNotExist: ERROR_GENERATIVE_AI_DOES_NOT_EXIST, ModelDoesNotBelongToType: ERROR_MODEL_DOES_NOT_BELONG_TO_TYPE, + ViewDoesNotExist: ERROR_VIEW_DOES_NOT_EXIST, } ) @validate_body(GenerateAIFieldValueViewSerializer, return_validated=True) @@ -125,24 +129,16 @@ def post(self, request: Request, field_id: int, data) -> Response: context=ai_field.table, ) - model = ai_field.table.get_model() - req_row_ids = data["row_ids"] - rows = RowHandler().get_rows(model, req_row_ids) - if len(rows) != len(req_row_ids): - found_rows_ids = [row.id for row in rows] - raise RowDoesNotExist(sorted(list(set(req_row_ids) - set(found_rows_ids)))) - - generative_ai_model_type = generative_ai_model_type_registry.get( - ai_field.ai_generative_ai_type + GenerateAIValuesJobType().get_valid_generative_ai_model_type_or_raise(ai_field) + job = JobHandler().create_and_start_job( + request.user, + GenerateAIValuesJobType.type, + field_id=field_id, + row_ids=data["row_ids"], ) - ai_models = generative_ai_model_type.get_enabled_models(workspace=workspace) - - if ai_field.ai_generative_ai_model not in ai_models: - raise ModelDoesNotBelongToType(model_name=ai_field.ai_generative_ai_model) - - generate_ai_values_for_rows.delay(request.user.id, ai_field.id, req_row_ids) - return Response(status=status.HTTP_202_ACCEPTED) + serializer = job_type_registry.get_serializer(job, JobSerializer) + return Response(serializer.data, status=status.HTTP_202_ACCEPTED) class GenerateFormulaWithAIView(APIView): diff --git a/premium/backend/src/baserow_premium/apps.py b/premium/backend/src/baserow_premium/apps.py index f80f879894..d3f88ca3d6 100644 --- a/premium/backend/src/baserow_premium/apps.py +++ b/premium/backend/src/baserow_premium/apps.py @@ -48,6 +48,12 @@ def ready(self): ai_field_output_registry.register(TextAIFieldOutputType()) ai_field_output_registry.register(ChoiceAIFieldOutputType()) + from baserow.core.jobs.registries import job_type_registry + + from .fields.job_types import GenerateAIValuesJobType + + job_type_registry.register(GenerateAIValuesJobType()) + from baserow.contrib.database.rows.registries import row_metadata_registry from baserow.contrib.database.views.registries import ( decorator_type_registry, @@ -177,7 +183,6 @@ def ready(self): settings_data_registry.register(InstanceWideSettingsDataType()) - import baserow_premium.fields.tasks # noqa: F401 from baserow_premium.integrations.registries import grouped_aggregation_registry from baserow.contrib.database.fields.field_aggregations import ( diff --git a/premium/backend/src/baserow_premium/fields/field_types.py b/premium/backend/src/baserow_premium/fields/field_types.py index 5b690aa8c0..dce63142ee 100644 --- a/premium/backend/src/baserow_premium/fields/field_types.py +++ b/premium/backend/src/baserow_premium/fields/field_types.py @@ -41,10 +41,10 @@ GenerativeAIWithFilesModelType, generative_ai_model_type_registry, ) +from baserow.core.jobs.handler import JobHandler from .models import AIField from .registries import ai_field_output_registry -from .tasks import generate_ai_values_for_rows from .visitors import extract_field_id_dependencies, replace_field_id_references User = get_user_model() @@ -392,8 +392,8 @@ def _handle_dependent_rows_change( row_ids = [starting_row.id] transaction.on_commit( - lambda: generate_ai_values_for_rows.delay( - field.ai_auto_update_user_id, field.id, row_ids + lambda: JobHandler().create_and_start_job( + user, "generate_ai_values", field_id=field.id, row_ids=row_ids ) ) diff --git a/premium/backend/src/baserow_premium/fields/job_types.py b/premium/backend/src/baserow_premium/fields/job_types.py new file mode 100644 index 0000000000..b9327bc360 --- /dev/null +++ b/premium/backend/src/baserow_premium/fields/job_types.py @@ -0,0 +1,336 @@ +from django.db.models import QuerySet + +from baserow_premium.generative_ai.managers import AIFileManager +from rest_framework import serializers + +from baserow.api.errors import ERROR_GROUP_DOES_NOT_EXIST, ERROR_USER_NOT_IN_GROUP +from baserow.contrib.database.api.fields.errors import ERROR_FIELD_DOES_NOT_EXIST +from baserow.contrib.database.api.views.errors import ERROR_VIEW_DOES_NOT_EXIST +from baserow.contrib.database.fields.exceptions import FieldDoesNotExist +from baserow.contrib.database.fields.handler import FieldHandler +from baserow.contrib.database.fields.operations import ListFieldsOperationType +from baserow.contrib.database.rows.exceptions import RowDoesNotExist +from baserow.contrib.database.rows.handler import RowHandler +from baserow.contrib.database.rows.runtime_formula_contexts import ( + HumanReadableRowContext, +) +from baserow.contrib.database.rows.signals import rows_ai_values_generation_error +from baserow.contrib.database.table.models import GeneratedTableModel +from baserow.contrib.database.views.exceptions import ViewDoesNotExist +from baserow.contrib.database.views.handler import ViewHandler +from baserow.core.exceptions import UserNotInWorkspace, WorkspaceDoesNotExist +from baserow.core.formula import resolve_formula +from baserow.core.formula.registries import formula_runtime_function_registry +from baserow.core.generative_ai.exceptions import ModelDoesNotBelongToType +from baserow.core.generative_ai.registries import ( + GenerativeAIWithFilesModelType, + generative_ai_model_type_registry, +) +from baserow.core.handler import CoreHandler +from baserow.core.job_types import _empty_transaction_context +from baserow.core.jobs.exceptions import MaxJobCountExceeded +from baserow.core.jobs.registries import JobType +from baserow.core.utils import ChildProgressBuilder + +from .models import AIField, GenerateAIValuesJob +from .registries import ai_field_output_registry + + +class GenerateAIValuesJobType(JobType): + type = "generate_ai_values" + model_class = GenerateAIValuesJob + max_count = 3 + + api_exceptions_map = { + UserNotInWorkspace: ERROR_USER_NOT_IN_GROUP, + WorkspaceDoesNotExist: ERROR_GROUP_DOES_NOT_EXIST, + ViewDoesNotExist: ERROR_VIEW_DOES_NOT_EXIST, + FieldDoesNotExist: ERROR_FIELD_DOES_NOT_EXIST, + } + serializer_field_names = [ + "field_id", + "row_ids", + "view_id", + "only_empty", + ] + serializer_field_overrides = { + "field_id": serializers.IntegerField( + help_text="The ID of the AI field to generate values for.", + ), + "row_ids": serializers.ListField( + child=serializers.IntegerField(), + required=False, + help_text="The IDs of the rows to generate AI values for. If not " + "provided, all rows in the view or table will be processed.", + ), + "view_id": serializers.IntegerField( + required=False, + help_text="The ID of the view to generate AI values for. If not provided, " + "the entire table will be processed.", + ), + "only_empty": serializers.BooleanField( + required=False, + help_text="Whether to only generate AI values for rows where the " + "field is empty.", + ), + } + + def can_schedule_or_raise(self, job: GenerateAIValuesJob): + """ + Checks whether a new job of this type can be scheduled for the given user. It + doesn't limit the number of jobs if specific row IDs are provided. It limits to + 1 job per table and to max_count jobs in total. + + :param job: The job instance that is going to be scheduled. + :raises MaxJobCountExceeded: If the user cannot schedule a new job of this type + """ + + # No limits when specific row IDs are provided + if job.row_ids: + return + + running_jobs = ( + GenerateAIValuesJob.objects.filter( + user_id=job.user.id, + row_ids__isnull=True, + ) + .is_pending_or_running() + .select_related("field") + ) + + # No more than max_count jobs in total + if len(running_jobs) >= self.max_count: + raise MaxJobCountExceeded( + f"You can only launch {self.max_count} {self.type} job(s) at " + "the same time." + ) + + # No more than 1 job per field + for running_job in running_jobs: + if running_job.field_id == job.field_id: + raise MaxJobCountExceeded( + f"You can only launch 1 {self.type} job(s) at " + "the same time for the same field." + ) + + def transaction_atomic_context(self, job: GenerateAIValuesJob): + # We want to commit a row at a time to provide faster feedback to the user. + return _empty_transaction_context() + + def _get_view_queryset(self, user, view_id: int, table_id: int): + """ + Returns the queryset for the given view as the given user. + + :param user: The user for whom the view queryset should be fetched. + :param view_id: The id of the view. + :param table_id: The id of the table the view belongs to. + :return: The queryset for the view. + :raises ViewDoesNotExist: If the view does not exist or the user has no access + to it. + """ + + handler = ViewHandler() + view = handler.get_view_as_user(user, view_id, table_id=table_id) + return handler.get_queryset(view) + + def _filter_empty_values( + self, queryset: QuerySet[GeneratedTableModel], ai_field: AIField + ) -> QuerySet[GeneratedTableModel]: + """ + Filters the given queryset to only include rows where the given AI field is + empty. + + :param queryset: The queryset to filter. + :param ai_field: The AI field to check for emptiness. + :return: The filtered queryset. + """ + + return queryset.filter( + **{f"{ai_field.db_column}__isnull": True} + ) | queryset.filter(**{ai_field.db_column: ""}) + + def get_valid_generative_ai_model_type_or_raise(self, ai_field: AIField): + """ + Returns the generative AI model type for the given AI field if the model belongs + to the type. Otherwise, raises a ModelDoesNotBelongToType exception. + + :param ai_field: The AI field to check. + :return: The generative AI model type. + :raises ModelDoesNotBelongToType: If the model does not belong to the type. + """ + + generative_ai_model_type = generative_ai_model_type_registry.get( + ai_field.ai_generative_ai_type + ) + workspace = ai_field.table.database.workspace + ai_models = generative_ai_model_type.get_enabled_models(workspace=workspace) + + if ai_field.ai_generative_ai_model not in ai_models: + raise ModelDoesNotBelongToType(model_name=ai_field.ai_generative_ai_model) + return generative_ai_model_type + + def _get_field(self, field_id: int) -> AIField: + """ + Returns the AI field with the given ID. + + :param field_id: The ID of the AI field to retrieve. + :return: The AI field instance. + :raises FieldDoesNotExist: If the field does not exist. + """ + + return FieldHandler().get_field( + field_id, + base_queryset=AIField.objects.all() + .select_related("table__database__workspace") + .prefetch_related("select_options"), + ) + + def prepare_values(self, values, user): + ai_field = self._get_field(values["field_id"]) + + model = ai_field.table.get_model() + req_row_ids = values.get("row_ids") + view_id = values.get("view_id") + + # Create the job instance without saving it yet, so we can use its mode property + unsaved_job = GenerateAIValuesJob(**values) + + if unsaved_job.mode == GenerateAIValuesJob.MODES.ROWS: + found_rows_ids = ( + RowHandler().get_rows(model, req_row_ids).values_list("id", flat=True) + ) + if len(found_rows_ids) != len(req_row_ids): + raise RowDoesNotExist( + sorted(list(set(req_row_ids) - set(found_rows_ids))) + ) + elif unsaved_job.mode == GenerateAIValuesJob.MODES.VIEW: + # Ensure the view exists in the table + ViewHandler().get_view_as_user(user, view_id, table_id=ai_field.table.id) + + return values + + def run(self, job: GenerateAIValuesJob, progress): + user = job.user + ai_field = self._get_field(job.field_id) + table = ai_field.table + workspace = table.database.workspace + model = table.get_model() + + CoreHandler().check_permissions( + job.user, + ListFieldsOperationType.type, + workspace=workspace, + context=ai_field.table, + ) + + if job.mode == GenerateAIValuesJob.MODES.VIEW: + rows = self._get_view_queryset(user, job.view_id, table.id) + elif job.mode == GenerateAIValuesJob.MODES.TABLE: + rows = model.objects.all() + elif job.mode == GenerateAIValuesJob.MODES.ROWS: + req_row_ids = job.row_ids + rows = RowHandler().get_rows(model, req_row_ids) + else: + raise ValueError(f"Unknown mode {job.mode} for GenerateAIValuesJob") + + if job.only_empty: + rows = self._filter_empty_values(rows, ai_field) + + try: + generative_ai_model_type = self.get_valid_generative_ai_model_type_or_raise( + ai_field + ) + except ModelDoesNotBelongToType as exc: + # If the workspace AI settings have been removed before the task starts, + # or if the export worker doesn't have the right env vars yet, then it can + # fail. We therefore want to handle the error gracefully. + # Note: rows might be a generator, so we can't pass it directly + rows_ai_values_generation_error.send( + self, + user=user, + rows=[], + field=ai_field, + table=ai_field.table, + error_message=str(exc), + ) + raise exc + + ai_output_type = ai_field_output_registry.get(ai_field.ai_output_type) + + progress_builder = progress.create_child_builder( + represents_progress=progress.total + ) + rows_progress = ChildProgressBuilder.build(progress_builder, rows.count()) + + for row in rows.iterator(chunk_size=200): + context = HumanReadableRowContext(row, exclude_field_ids=[ai_field.id]) + message = str( + resolve_formula( + ai_field.ai_prompt, formula_runtime_function_registry, context + ) + ) + + # The AI output type should be able to format the prompt because it can add + # additional instructions to it. The choice output type for example adds + # additional prompt trying to force the out, for example. + message = ai_output_type.format_prompt(message, ai_field) + + try: + if ai_field.ai_file_field_id is not None and isinstance( + generative_ai_model_type, GenerativeAIWithFilesModelType + ): + file_ids = AIFileManager.upload_files_from_file_field( + ai_field, row, generative_ai_model_type, workspace=workspace + ) + try: + value = generative_ai_model_type.prompt_with_files( + ai_field.ai_generative_ai_model, + message, + file_ids=file_ids, + workspace=workspace, + temperature=ai_field.ai_temperature, + ) + except Exception as exc: + raise exc + finally: + generative_ai_model_type.delete_files( + file_ids, workspace=workspace + ) + else: + value = generative_ai_model_type.prompt( + ai_field.ai_generative_ai_model, + message, + workspace=workspace, + temperature=ai_field.ai_temperature, + ) + + # Because the AI output type can change the prompt to try to force the + # output a certain way, then it should give the opportunity to parse the + # output when it's given. With the choice output type, it will try to + # match it to a `SelectOption`, for example. + value = ai_output_type.parse_output(value, ai_field) + except Exception as exc: + # If the prompt fails once, we should not continue with the other rows. + # Note: rows might be a generator, so we can't slice it + rows_ai_values_generation_error.send( + self, + user=user, + rows=[], + field=ai_field, + table=table, + error_message=str(exc), + ) + raise exc + + # FIXME: manually set the websocket_id to None for now because the frontend + # needs to receive the update to stop the loading state + user.web_socket_id = None + RowHandler().update_row_by_id( + user, + table, + row.id, + {ai_field.db_column: value}, + model=model, + values_already_prepared=True, + ) + rows_progress.increment() diff --git a/premium/backend/src/baserow_premium/fields/models.py b/premium/backend/src/baserow_premium/fields/models.py index bd72568def..5e733cff39 100644 --- a/premium/backend/src/baserow_premium/fields/models.py +++ b/premium/backend/src/baserow_premium/fields/models.py @@ -1,8 +1,17 @@ +from enum import StrEnum + from django.contrib.auth import get_user_model +from django.contrib.postgres.fields import ArrayField from django.db import models from baserow.contrib.database.fields.models import Field from baserow.core.formula.field import FormulaField as ModelFormulaField +from baserow.core.jobs.mixins import ( + JobWithUndoRedoIds, + JobWithUserIpAddress, + JobWithWebsocketId, +) +from baserow.core.jobs.models import Job from .ai_field_output_types import TextAIFieldOutputType from .registries import ai_field_output_registry @@ -48,3 +57,39 @@ def __getattr__(self, name): return output_field._meta.get_field(name).default except Exception: super().__getattr__(name) + + +class GenerateAIValuesJob( + JobWithUserIpAddress, JobWithWebsocketId, JobWithUndoRedoIds, Job +): + class MODES(StrEnum): + ROWS = "rows" + VIEW = "view" + TABLE = "table" + + field = models.ForeignKey( + Field, + on_delete=models.CASCADE, + related_name="+", + help_text="The AI field to generate values for.", + ) + row_ids = ArrayField( + models.IntegerField(), + null=True, + help_text="If provided, the row IDs to generate AI values for.", + ) + view_id = models.IntegerField( + null=True, help_text="If provided, the view ID to generate AI values for." + ) + only_empty = models.BooleanField( + default=False, help_text="Whether to only generate values for empty cells." + ) + + @property + def mode(self): + if self.row_ids is not None: + return self.MODES.ROWS + elif self.view_id is not None: + return self.MODES.VIEW + else: # Without filters, generate the values for the whole table + return self.MODES.TABLE diff --git a/premium/backend/src/baserow_premium/fields/tasks.py b/premium/backend/src/baserow_premium/fields/tasks.py deleted file mode 100644 index e3006e7868..0000000000 --- a/premium/backend/src/baserow_premium/fields/tasks.py +++ /dev/null @@ -1,141 +0,0 @@ -from baserow_premium.generative_ai.managers import AIFileManager - -from baserow.config.celery import app -from baserow.contrib.database.fields.handler import FieldHandler -from baserow.contrib.database.fields.operations import ListFieldsOperationType -from baserow.contrib.database.rows.exceptions import RowDoesNotExist -from baserow.contrib.database.rows.handler import RowHandler -from baserow.contrib.database.rows.runtime_formula_contexts import ( - HumanReadableRowContext, -) -from baserow.contrib.database.rows.signals import rows_ai_values_generation_error -from baserow.core.formula import resolve_formula -from baserow.core.formula.registries import formula_runtime_function_registry -from baserow.core.generative_ai.exceptions import ModelDoesNotBelongToType -from baserow.core.generative_ai.registries import ( - GenerativeAIWithFilesModelType, - generative_ai_model_type_registry, -) -from baserow.core.handler import CoreHandler -from baserow.core.user.handler import User - -from .models import AIField -from .registries import ai_field_output_registry - - -@app.task(bind=True, queue="export") -def generate_ai_values_for_rows(self, user_id: int, field_id: int, row_ids: list[int]): - user = User.objects.get(pk=user_id) - - ai_field = FieldHandler().get_field( - field_id, - base_queryset=AIField.objects.all() - .select_related("table__database__workspace") - .prefetch_related("select_options"), - ) - table = ai_field.table - workspace = table.database.workspace - - CoreHandler().check_permissions( - user, - ListFieldsOperationType.type, - workspace=workspace, - context=table, - ) - - model = ai_field.table.get_model() - req_row_ids = row_ids - rows = RowHandler().get_rows(model, req_row_ids) - if len(rows) != len(req_row_ids): - found_rows_ids = [row.id for row in rows] - raise RowDoesNotExist(sorted(list(set(req_row_ids) - set(found_rows_ids)))) - - try: - generative_ai_model_type = generative_ai_model_type_registry.get( - ai_field.ai_generative_ai_type - ) - ai_models = generative_ai_model_type.get_enabled_models(workspace=workspace) - - if ai_field.ai_generative_ai_model not in ai_models: - raise ModelDoesNotBelongToType(model_name=ai_field.ai_generative_ai_model) - except ModelDoesNotBelongToType as exc: - # If the workspace AI settings have been removed before the task starts, - # or if the export worker doesn't have the right env vars yet, then it can - # fail. We therefore want to handle the error gracefully. - rows_ai_values_generation_error.send( - self, - user=user, - rows=rows, - field=ai_field, - table=table, - error_message=str(exc), - ) - raise exc - - ai_output_type = ai_field_output_registry.get(ai_field.ai_output_type) - - for i, row in enumerate(rows): - context = HumanReadableRowContext(row, exclude_field_ids=[ai_field.id]) - message = str( - resolve_formula( - ai_field.ai_prompt, formula_runtime_function_registry, context - ) - ) - - # The AI output type should be able to format the prompt because it can add - # additional instructions to it. The choice output type for example adds - # additional prompt trying to force the out, for example. - message = ai_output_type.format_prompt(message, ai_field) - - try: - if ai_field.ai_file_field_id is not None and isinstance( - generative_ai_model_type, GenerativeAIWithFilesModelType - ): - file_ids = AIFileManager.upload_files_from_file_field( - ai_field, row, generative_ai_model_type, workspace=workspace - ) - try: - value = generative_ai_model_type.prompt_with_files( - ai_field.ai_generative_ai_model, - message, - file_ids=file_ids, - workspace=workspace, - temperature=ai_field.ai_temperature, - ) - except Exception as exc: - raise exc - finally: - generative_ai_model_type.delete_files(file_ids, workspace=workspace) - else: - value = generative_ai_model_type.prompt( - ai_field.ai_generative_ai_model, - message, - workspace=workspace, - temperature=ai_field.ai_temperature, - ) - - # Because the AI output type can change the prompt to try to force the - # output a certain way, then it should give the opportunity to parse the - # output when it's given. With the choice output type, it will try to match - # it to a `SelectOption`, for example. - value = ai_output_type.parse_output(value, ai_field) - except Exception as exc: - # If the prompt fails once, we should not continue with the other rows. - rows_ai_values_generation_error.send( - self, - user=user, - rows=rows[i:], - field=ai_field, - table=table, - error_message=str(exc), - ) - raise exc - - RowHandler().update_row_by_id( - user, - table, - row.id, - {ai_field.db_column: value}, - model=model, - values_already_prepared=True, - ) diff --git a/premium/backend/src/baserow_premium/migrations/0030_generateaivaluesjob.py b/premium/backend/src/baserow_premium/migrations/0030_generateaivaluesjob.py new file mode 100644 index 0000000000..e89c381867 --- /dev/null +++ b/premium/backend/src/baserow_premium/migrations/0030_generateaivaluesjob.py @@ -0,0 +1,98 @@ +# Generated by Django 5.0.14 on 2025-11-12 21:44 + +import django.contrib.postgres.fields +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("baserow_premium", "0029_ai_field_auto_update"), + ("core", "0107_twofactorauthprovidermodel_totpauthprovidermodel_and_more"), + ("database", "0200_fix_to_timestamptz_formula"), + ] + + operations = [ + migrations.CreateModel( + name="GenerateAIValuesJob", + fields=[ + ( + "job_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="core.job", + ), + ), + ( + "user_ip_address", + models.GenericIPAddressField( + help_text="The user IP address.", null=True + ), + ), + ( + "user_websocket_id", + models.CharField( + help_text="The user websocket uuid needed to manage signals sent correctly.", + max_length=36, + null=True, + ), + ), + ( + "user_session_id", + models.CharField( + help_text="The user session uuid needed for undo/redo functionality.", + max_length=36, + null=True, + ), + ), + ( + "user_action_group_id", + models.CharField( + help_text="The user session uuid needed for undo/redo action group functionality.", + max_length=36, + null=True, + ), + ), + ( + "row_ids", + django.contrib.postgres.fields.ArrayField( + base_field=models.IntegerField(), + help_text="If provided, the row IDs to generate AI values for.", + null=True, + size=None, + ), + ), + ( + "view_id", + models.IntegerField( + help_text="If provided, the view ID to generate AI values for.", + null=True, + ), + ), + ( + "only_empty", + models.BooleanField( + default=False, + help_text="Whether to only generate values for empty cells.", + ), + ), + ( + "field", + models.ForeignKey( + help_text="The AI field to generate values for.", + on_delete=django.db.models.deletion.CASCADE, + related_name="+", + to="database.field", + ), + ), + ], + options={ + "abstract": False, + }, + bases=("core.job", models.Model), + ), + ] diff --git a/premium/backend/tests/baserow_premium_tests/api/fields/test_ai_field_views.py b/premium/backend/tests/baserow_premium_tests/api/fields/test_ai_field_views.py index d0b7ebf6c7..59770df2cd 100644 --- a/premium/backend/tests/baserow_premium_tests/api/fields/test_ai_field_views.py +++ b/premium/backend/tests/baserow_premium_tests/api/fields/test_ai_field_views.py @@ -1,5 +1,3 @@ -from unittest.mock import patch - from django.conf import settings from django.shortcuts import reverse from django.test.utils import override_settings @@ -285,10 +283,9 @@ def test_generate_ai_field_value_view_generative_ai_model_does_not_belong_to_typ @pytest.mark.django_db @pytest.mark.field_ai @override_settings(DEBUG=True) -@patch("baserow_premium.fields.tasks.generate_ai_values_for_rows.apply") -def test_generate_ai_field_value_view_generative_ai( - patched_generate_ai_values_for_rows, premium_data_fixture, api_client -): +def test_generate_ai_field_value_view_generative_ai(premium_data_fixture, api_client): + """Test that the API endpoint creates a job to generate AI field values.""" + premium_data_fixture.register_fake_generate_ai_type() user, token = premium_data_fixture.create_user_and_token( email="test@test.nl", @@ -305,16 +302,7 @@ def test_generate_ai_field_value_view_generative_ai( table=table, name="ai", ai_prompt="'Hello'" ) - rows = ( - RowHandler() - .create_rows( - user, - table, - rows_values=[{}], - ) - .created_rows - ) - assert patched_generate_ai_values_for_rows.call_count == 0 + rows = RowHandler().create_rows(user, table, rows_values=[{}]).created_rows response = api_client.post( reverse( @@ -326,7 +314,15 @@ def test_generate_ai_field_value_view_generative_ai( HTTP_AUTHORIZATION=f"JWT {token}", ) assert response.status_code == HTTP_202_ACCEPTED - assert patched_generate_ai_values_for_rows.call_count == 1 + + # Verify the response contains job data + response_json = response.json() + assert "id" in response_json # Job ID + assert response_json["type"] == "generate_ai_values" + assert response_json["state"] in [ + "pending", + "finished", + ] # Might complete immediately in tests @pytest.mark.django_db diff --git a/premium/backend/tests/baserow_premium_tests/fields/test_ai_field_output_types.py b/premium/backend/tests/baserow_premium_tests/fields/test_ai_field_output_types.py index bc07fbd892..2b9b09ab66 100644 --- a/premium/backend/tests/baserow_premium_tests/fields/test_ai_field_output_types.py +++ b/premium/backend/tests/baserow_premium_tests/fields/test_ai_field_output_types.py @@ -2,13 +2,13 @@ import pytest from baserow_premium.fields.ai_field_output_types import StrictEnumOutputParser -from baserow_premium.fields.tasks import generate_ai_values_for_rows from langchain_core.prompts import PromptTemplate from baserow.core.generative_ai.registries import ( GenerativeAIModelType, generative_ai_model_type_registry, ) +from baserow.core.jobs.handler import JobHandler def test_strict_enum_output_parser(): @@ -100,7 +100,13 @@ def get_settings_serializer(self): row_1 = model.objects.create() row_2 = model.objects.create() - generate_ai_values_for_rows(user.id, field.id, [row_1.id, row_2.id]) + JobHandler().create_and_start_job( + user, + "generate_ai_values", + sync=True, + field_id=field.id, + row_ids=[row_1.id, row_2.id], + ) row_1.refresh_from_db() row_2.refresh_from_db() diff --git a/premium/backend/tests/baserow_premium_tests/fields/test_ai_field_tasks.py b/premium/backend/tests/baserow_premium_tests/fields/test_ai_field_tasks.py deleted file mode 100644 index 69ef60b80e..0000000000 --- a/premium/backend/tests/baserow_premium_tests/fields/test_ai_field_tasks.py +++ /dev/null @@ -1,510 +0,0 @@ -from io import BytesIO -from unittest.mock import patch - -from django.test.utils import override_settings - -import pytest -from baserow_premium.fields.tasks import generate_ai_values_for_rows - -from baserow.contrib.database.fields.handler import FieldHandler -from baserow.contrib.database.rows.handler import RowHandler -from baserow.core.generative_ai.exceptions import GenerativeAIPromptError -from baserow.core.storage import get_default_storage -from baserow.core.user_files.handler import UserFileHandler - - -@pytest.mark.django_db -@pytest.mark.field_ai -@patch("baserow.contrib.database.rows.signals.rows_updated.send") -def test_generate_ai_field_value_view_generative_ai( - patched_rows_updated, premium_data_fixture -): - premium_data_fixture.register_fake_generate_ai_type() - user = premium_data_fixture.create_user( - email="test@test.nl", password="password", first_name="Test1" - ) - - database = premium_data_fixture.create_database_application( - user=user, name="database" - ) - table = premium_data_fixture.create_database_table(name="table", database=database) - field = premium_data_fixture.create_ai_field( - table=table, name="ai", ai_prompt="'Hello'" - ) - - rows = RowHandler().create_rows(user, table, rows_values=[{}]).created_rows - - assert patched_rows_updated.call_count == 0 - generate_ai_values_for_rows(user.id, field.id, [rows[0].id]) - assert patched_rows_updated.call_count == 1 - updated_row = patched_rows_updated.call_args[1]["rows"][0] - assert ( - getattr(updated_row, field.db_column) - == "Generated with temperature None: Hello" - ) - assert patched_rows_updated.call_args[1]["updated_field_ids"] == set([field.id]) - - -@pytest.mark.django_db -@pytest.mark.field_ai -@patch("baserow.contrib.database.rows.signals.rows_updated.send") -def test_generate_ai_field_value_view_generative_ai_with_temperature( - patched_rows_updated, premium_data_fixture -): - premium_data_fixture.register_fake_generate_ai_type() - user = premium_data_fixture.create_user( - email="test@test.nl", password="password", first_name="Test1" - ) - - database = premium_data_fixture.create_database_application( - user=user, name="database" - ) - table = premium_data_fixture.create_database_table(name="table", database=database) - field = premium_data_fixture.create_ai_field( - table=table, name="ai", ai_prompt="'Hello'", ai_temperature=0.7 - ) - - rows = RowHandler().create_rows(user, table, rows_values=[{}]).created_rows - - generate_ai_values_for_rows(user.id, field.id, [rows[0].id]) - updated_row = patched_rows_updated.call_args[1]["rows"][0] - assert ( - getattr(updated_row, field.db_column) == "Generated with temperature 0.7: Hello" - ) - - -@pytest.mark.django_db -@pytest.mark.field_ai -@patch("baserow.contrib.database.rows.signals.rows_updated.send") -def test_generate_ai_field_value_view_generative_ai_parse_formula( - patched_rows_updated, premium_data_fixture -): - premium_data_fixture.register_fake_generate_ai_type() - user = premium_data_fixture.create_user( - email="test@test.nl", password="password", first_name="Test1" - ) - - database = premium_data_fixture.create_database_application( - user=user, name="database" - ) - table = premium_data_fixture.create_database_table(name="table", database=database) - firstname = premium_data_fixture.create_text_field(table=table, name="firstname") - lastname = premium_data_fixture.create_text_field(table=table, name="lastname") - formula = f"concat('Hello ', get('fields.field_{firstname.id}'), ' ', get('fields.field_{lastname.id}'))" - field = premium_data_fixture.create_ai_field( - table=table, name="ai", ai_prompt=formula - ) - - rows = ( - RowHandler() - .create_rows( - user, - table, - rows_values=[ - {f"field_{firstname.id}": "Bram", f"field_{lastname.id}": "Wiepjes"}, - ], - ) - .created_rows - ) - - assert patched_rows_updated.call_count == 0 - generate_ai_values_for_rows(user.id, field.id, [rows[0].id]) - assert patched_rows_updated.call_count == 1 - updated_row = patched_rows_updated.call_args[1]["rows"][0] - assert ( - getattr(updated_row, field.db_column) - == "Generated with temperature None: Hello Bram Wiepjes" - ) - assert patched_rows_updated.call_args[1]["updated_field_ids"] == set([field.id]) - - -@pytest.mark.django_db -@pytest.mark.field_ai -@patch("baserow.contrib.database.rows.signals.rows_updated.send") -def test_generate_ai_field_value_view_generative_ai_invalid_field( - patched_rows_updated, premium_data_fixture -): - premium_data_fixture.register_fake_generate_ai_type() - user = premium_data_fixture.create_user( - email="test@test.nl", password="password", first_name="Test1" - ) - - database = premium_data_fixture.create_database_application( - user=user, name="database" - ) - table = premium_data_fixture.create_database_table(name="table", database=database) - firstname = premium_data_fixture.create_text_field(table=table, name="firstname") - formula = "concat('Hello ', get('fields.field_0'))" - field = premium_data_fixture.create_ai_field( - table=table, name="ai", ai_prompt=formula - ) - - rows = ( - RowHandler() - .create_rows( - user, - table, - rows_values=[{f"field_{firstname.id}": "Bram"}], - ) - .created_rows - ) - assert patched_rows_updated.call_count == 0 - generate_ai_values_for_rows(user.id, field.id, [rows[0].id]) - assert patched_rows_updated.call_count == 1 - updated_row = patched_rows_updated.call_args[1]["rows"][0] - assert ( - getattr(updated_row, field.db_column) - == "Generated with temperature None: Hello " - ) - - -@pytest.mark.django_db -@pytest.mark.field_ai -@patch("baserow.contrib.database.rows.signals.rows_ai_values_generation_error.send") -@patch("baserow.contrib.database.rows.signals.rows_updated.send") -def test_generate_ai_field_value_view_generative_ai_invalid_prompt( - patched_rows_updated, patched_rows_ai_values_generation_error, premium_data_fixture -): - premium_data_fixture.register_fake_generate_ai_type() - user = premium_data_fixture.create_user( - email="test@test.nl", password="password", first_name="Test1" - ) - - database = premium_data_fixture.create_database_application( - user=user, name="database" - ) - table = premium_data_fixture.create_database_table(name="table", database=database) - firstname = premium_data_fixture.create_text_field(table=table, name="firstname") - formula = "concat('Hello ', get('fields.field_0'))" - field = premium_data_fixture.create_ai_field( - table=table, - name="ai", - ai_generative_ai_type="test_generative_ai_prompt_error", - ai_prompt=formula, - ) - - rows = ( - RowHandler() - .create_rows( - user, - table, - rows_values=[{f"field_{firstname.id}": "Bram"}], - ) - .created_rows - ) - - assert patched_rows_ai_values_generation_error.call_count == 0 - - with pytest.raises(GenerativeAIPromptError): - generate_ai_values_for_rows(user.id, field.id, [rows[0].id]) - - assert patched_rows_updated.call_count == 0 - assert patched_rows_ai_values_generation_error.call_count == 1 - call_args_rows = patched_rows_ai_values_generation_error.call_args[1]["rows"] - assert len(call_args_rows) == 1 - assert rows[0].id == call_args_rows[0].id - assert patched_rows_ai_values_generation_error.call_args[1]["field"] == field - assert ( - patched_rows_ai_values_generation_error.call_args[1]["error_message"] - == "Test error" - ) - - -@pytest.mark.django_db -@pytest.mark.field_ai -@patch("baserow.contrib.database.rows.signals.rows_updated.send") -def test_generate_ai_field_value_view_generative_ai_with_files( - patched_rows_updated, premium_data_fixture -): - storage = get_default_storage() - - premium_data_fixture.register_fake_generate_ai_type() - user = premium_data_fixture.create_user( - email="test@test.nl", password="password", first_name="Test1" - ) - database = premium_data_fixture.create_database_application( - user=user, name="database" - ) - table = premium_data_fixture.create_database_table(name="table", database=database) - file_field = premium_data_fixture.create_file_field( - table=table, order=0, name="File" - ) - field = premium_data_fixture.create_ai_field( - table=table, - name="ai", - ai_generative_ai_type="test_generative_ai_with_files", - ai_prompt="'Test prompt'", - ai_file_field=file_field, - ) - table_model = table.get_model() - user_file_1 = UserFileHandler().upload_user_file( - user, "aifile.txt", BytesIO(b"Text in file"), storage=storage - ) - values = {f"field_{file_field.id}": [{"name": user_file_1.name}]} - row = RowHandler().force_create_row( - user, - table, - values, - table_model, - ) - - assert patched_rows_updated.call_count == 0 - generate_ai_values_for_rows(user.id, field.id, [row.id]) - assert patched_rows_updated.call_count == 1 - updated_row = patched_rows_updated.call_args[1]["rows"][0] - assert "Generated with files" in getattr(updated_row, field.db_column) - assert "Test prompt" in getattr(updated_row, field.db_column) - assert patched_rows_updated.call_args[1]["updated_field_ids"] == set([field.id]) - - -@pytest.mark.django_db(transaction=True) -@pytest.mark.field_ai -@override_settings(DEBUG=True) -@patch("baserow_premium.fields.tasks.generate_ai_values_for_rows.delay") -def test_generate_ai_field_value_no_auto_update(patched_task, premium_data_fixture): - premium_data_fixture.register_fake_generate_ai_type() - user = premium_data_fixture.create_user( - email="test@test.nl", password="password", first_name="Test1" - ) - - database = premium_data_fixture.create_database_application( - user=user, name="database" - ) - table = premium_data_fixture.create_database_table(name="table", database=database) - text_field = premium_data_fixture.create_text_field(table=table, name="text") - ai_field = FieldHandler().create_field( - table=table, - user=user, - name="ai", - type_name="ai", - ai_generative_ai_type="test_generative_ai", - ai_generative_ai_model="test_1", - ai_prompt=f"get('fields.field_{text_field.id}')", - ai_temperature=0.7, - ai_auto_update=False, - ) - - RowHandler().create_rows( - user, - table, - rows_values=[{text_field.db_column: "test"}], - send_webhook_events=False, - send_realtime_update=False, - ).created_rows - - assert patched_task.call_count == 0 - - -@pytest.mark.django_db(transaction=True) -@pytest.mark.field_ai -@override_settings(DEBUG=True) -@patch("baserow_premium.fields.tasks.generate_ai_values_for_rows.delay") -def test_generate_ai_field_value_auto_update(patched_task, premium_data_fixture): - premium_data_fixture.register_fake_generate_ai_type() - user = premium_data_fixture.create_user( - email="test@test.nl", - password="password", - first_name="Test1", - has_active_premium_license=True, - ) - - database = premium_data_fixture.create_database_application( - user=user, name="database" - ) - table = premium_data_fixture.create_database_table(name="table", database=database) - text_field = premium_data_fixture.create_text_field(table=table, name="text") - ai_field = FieldHandler().create_field( - table=table, - user=user, - name="ai", - type_name="ai", - ai_generative_ai_type="test_generative_ai", - ai_generative_ai_model="test_1", - ai_prompt=f"get('fields.field_{text_field.id}')", - ai_temperature=0.7, - ai_auto_update=True, - ) - - rows = ( - RowHandler() - .create_rows( - user, - table, - rows_values=[{text_field.db_column: "test"}], - send_webhook_events=False, - send_realtime_update=False, - ) - .created_rows - ) - - assert patched_task.call_count == 1 - - call_args = patched_task.call_args.args - # field_id: int, row_ids: list[int] - assert call_args == ( - user.id, - ai_field.id, - [r.id for r in rows], - ) - - -@pytest.mark.django_db(transaction=True) -@pytest.mark.field_ai -@override_settings(DEBUG=True) -@patch("baserow_premium.fields.tasks.generate_ai_values_for_rows.delay") -def test_generate_ai_field_value_auto_update_no_license_user( - patched_task, premium_data_fixture -): - premium_data_fixture.register_fake_generate_ai_type() - user = premium_data_fixture.create_user( - email="test@test.nl", password="password", first_name="Test1" - ) - - database = premium_data_fixture.create_database_application( - user=user, name="database" - ) - table = premium_data_fixture.create_database_table(name="table", database=database) - text_field = premium_data_fixture.create_text_field(table=table, name="text") - # user has no license, but the license check is done before so this will create - # a field with auto update enabled for a user without license. - ai_field = FieldHandler().create_field( - table=table, - user=user, - name="ai", - type_name="ai", - ai_generative_ai_type="test_generative_ai", - ai_generative_ai_model="test_1", - ai_prompt=f"get('fields.field_{text_field.id}')", - ai_temperature=0.7, - ai_auto_update=True, - ) - - rows = ( - RowHandler() - .create_rows( - user, - table, - rows_values=[{text_field.db_column: "test"}], - send_webhook_events=False, - send_realtime_update=False, - ) - .created_rows - ) - - # On the first attempt the license check will fail and the auto update will be - # disabled. - assert patched_task.call_count == 0 - ai_field.refresh_from_db() - assert ai_field.ai_auto_update is False - - -@pytest.mark.django_db(transaction=True) -@pytest.mark.field_ai -@override_settings(DEBUG=True) -def test_generate_ai_field_no_user_task_executed(premium_data_fixture): - premium_data_fixture.register_fake_generate_ai_type() - user = premium_data_fixture.create_user( - email="test@test.nl", - password="password", - first_name="Test1", - has_active_premium_license=True, - ) - - database = premium_data_fixture.create_database_application( - user=user, name="database" - ) - table = premium_data_fixture.create_database_table(name="table", database=database) - text_field = premium_data_fixture.create_text_field(table=table, name="text") - ai_field = FieldHandler().create_field( - table=table, - user=user, - name="ai", - type_name="ai", - ai_generative_ai_type="test_generative_ai", - ai_generative_ai_model="test_1", - ai_prompt=f"get('fields.field_{text_field.id}')", - ai_temperature=0.7, - ai_auto_update=True, - ) - - rows = ( - RowHandler() - .create_rows( - user, - table, - rows_values=[{text_field.db_column: "test text value"}], - send_webhook_events=False, - send_realtime_update=False, - ) - .created_rows - ) - - row = rows[0] - row.refresh_from_db() - - assert ( - getattr(row, ai_field.db_column) - == "Generated with temperature 0.7: test text value" - ) - - -@pytest.mark.django_db(transaction=True) -@pytest.mark.field_ai -@override_settings(DEBUG=True) -def test_generate_ai_field_auto_update_without_user(premium_data_fixture): - premium_data_fixture.register_fake_generate_ai_type() - user = premium_data_fixture.create_user( - email="test@test.nl", - password="password", - first_name="Test1", - has_active_premium_license=True, - ) - other_user = premium_data_fixture.create_user( - email="test2@test.nl", - password="password", - first_name="Test2", - has_active_premium_license=True, - ) - - workspace = premium_data_fixture.create_workspace(users=[user, other_user]) - database = premium_data_fixture.create_database_application( - workspace=workspace, name="database" - ) - - table = premium_data_fixture.create_database_table(name="table", database=database) - text_field = premium_data_fixture.create_text_field(table=table, name="text") - ai_field = FieldHandler().create_field( - table=table, - user=user, - name="ai", - type_name="ai", - ai_generative_ai_type="test_generative_ai", - ai_generative_ai_model="test_1", - ai_prompt=f"get('fields.field_{text_field.id}')", - ai_temperature=0.7, - ai_auto_update=True, - ) - - assert ai_field.ai_auto_update_user_id == user.id - user.delete() - ai_field.refresh_from_db() - assert ai_field.ai_auto_update_user_id is None - - rows = ( - RowHandler() - .create_rows( - other_user, - table, - rows_values=[{text_field.db_column: "test text value"}], - send_webhook_events=False, - send_realtime_update=False, - ) - .created_rows - ) - - row = rows[0] - row.refresh_from_db() - - assert getattr(row, ai_field.db_column) is None - ai_field.refresh_from_db() - assert ai_field.ai_auto_update is False diff --git a/premium/backend/tests/baserow_premium_tests/fields/test_generate_ai_values_job_execution.py b/premium/backend/tests/baserow_premium_tests/fields/test_generate_ai_values_job_execution.py new file mode 100644 index 0000000000..7cdad415e9 --- /dev/null +++ b/premium/backend/tests/baserow_premium_tests/fields/test_generate_ai_values_job_execution.py @@ -0,0 +1,352 @@ +""" +Tests for GenerateAIValuesJob execution in all modes. +""" +from unittest.mock import patch + +import pytest +from baserow_premium.fields.models import GenerateAIValuesJob + +from baserow.contrib.database.rows.handler import RowHandler +from baserow.core.jobs.handler import JobHandler + + +@pytest.mark.django_db +@pytest.mark.field_ai +@patch("baserow.contrib.database.rows.signals.rows_updated.send") +def test_job_execution_rows_mode(patched_rows_updated, premium_data_fixture): + """Test job execution in ROWS mode generates values for specific rows.""" + + premium_data_fixture.register_fake_generate_ai_type() + user = premium_data_fixture.create_user() + database = premium_data_fixture.create_database_application(user=user) + table = premium_data_fixture.create_database_table(database=database) + field = premium_data_fixture.create_ai_field(table=table, ai_prompt="'Test'") + + rows = RowHandler().create_rows(user, table, rows_values=[{}, {}, {}]).created_rows + row_ids = [rows[0].id, rows[2].id] # Only process first and third + + job = JobHandler().create_and_start_job( + user, "generate_ai_values", sync=True, field_id=field.id, row_ids=row_ids + ) + + assert job.state == "finished" + assert job.progress_percentage == 100 + + # Verify only specified rows were updated + assert patched_rows_updated.call_count == 2 # One call per row + + # Refresh rows and check values + model = table.get_model() + rows = model.objects.all().order_by("id") + assert getattr(rows[0], field.db_column) == "Generated with temperature None: Test" + assert getattr(rows[1], field.db_column) is None # Not updated + assert getattr(rows[2], field.db_column) == "Generated with temperature None: Test" + + +@pytest.mark.django_db +@pytest.mark.field_ai +@patch("baserow.contrib.database.rows.signals.rows_updated.send") +def test_job_execution_table_mode(patched_rows_updated, premium_data_fixture): + """Test job execution in TABLE mode generates values for all rows.""" + + premium_data_fixture.register_fake_generate_ai_type() + user = premium_data_fixture.create_user() + database = premium_data_fixture.create_database_application(user=user) + table = premium_data_fixture.create_database_table(database=database) + field = premium_data_fixture.create_ai_field(table=table, ai_prompt="'Table Test'") + + rows = RowHandler().create_rows(user, table, rows_values=[{}, {}, {}]).created_rows + + job = JobHandler().create_and_start_job( + user, "generate_ai_values", sync=True, field_id=field.id + ) + + assert job.state == "finished" + assert job.mode == GenerateAIValuesJob.MODES.TABLE + + # Verify all rows were updated + assert patched_rows_updated.call_count == 3 + + model = table.get_model() + for row in model.objects.all(): + assert ( + getattr(row, field.db_column) + == "Generated with temperature None: Table Test" + ) + + +@pytest.mark.django_db +@pytest.mark.field_ai +@patch("baserow.contrib.database.rows.signals.rows_updated.send") +def test_job_execution_view_mode(patched_rows_updated, premium_data_fixture): + """Test job execution in VIEW mode generates values for filtered rows.""" + + premium_data_fixture.register_fake_generate_ai_type() + user = premium_data_fixture.create_user() + database = premium_data_fixture.create_database_application(user=user) + table = premium_data_fixture.create_database_table(database=database) + text_field = premium_data_fixture.create_text_field(table=table, name="text") + field = premium_data_fixture.create_ai_field(table=table, ai_prompt="'View Test'") + view = premium_data_fixture.create_grid_view(table=table) + + # Create filter: only rows with text="show" + premium_data_fixture.create_view_filter( + view=view, field=text_field, type="equal", value="show" + ) + + # Create rows: 2 matching filter, 1 not matching + RowHandler().create_rows( + user, + table, + rows_values=[ + {f"field_{text_field.id}": "show"}, + {f"field_{text_field.id}": "hide"}, + {f"field_{text_field.id}": "show"}, + ], + ) + + job = JobHandler().create_and_start_job( + user, "generate_ai_values", sync=True, field_id=field.id, view_id=view.id + ) + + assert job.state == "finished" + assert job.mode == GenerateAIValuesJob.MODES.VIEW + + # Verify only filtered rows were updated (2 rows) + assert patched_rows_updated.call_count == 2 + + model = table.get_model() + for row in model.objects.filter(**{f"field_{text_field.id}": "show"}): + assert ( + getattr(row, field.db_column) + == "Generated with temperature None: View Test" + ) + + # Verify hidden row was NOT updated + hidden_row = model.objects.get(**{f"field_{text_field.id}": "hide"}) + assert getattr(hidden_row, field.db_column) is None + + +@pytest.mark.django_db +@pytest.mark.field_ai +@patch("baserow.contrib.database.rows.signals.rows_updated.send") +def test_job_execution_only_empty_rows_mode(patched_rows_updated, premium_data_fixture): + """ + Test only_empty flag in ROWS mode only updates empty cells. + """ + + premium_data_fixture.register_fake_generate_ai_type() + user = premium_data_fixture.create_user() + database = premium_data_fixture.create_database_application(user=user) + table = premium_data_fixture.create_database_table(database=database) + field = premium_data_fixture.create_ai_field(table=table, ai_prompt="'Empty Test'") + + rows = RowHandler().create_rows(user, table, rows_values=[{}, {}, {}]).created_rows + + # Pre-fill one row + model = table.get_model() + pre_filled_value = "Pre-filled" + model.objects.filter(id=rows[1].id).update(**{field.db_column: pre_filled_value}) + + job = JobHandler().create_and_start_job( + user, + "generate_ai_values", + sync=True, + field_id=field.id, + row_ids=[row.id for row in rows], + only_empty=True, + ) + + assert job.state == "finished" + assert job.only_empty is True + + # Verify only 2 rows were updated (empty ones) + assert patched_rows_updated.call_count == 2 + + # Check that pre-filled row kept its value + rows_refreshed = model.objects.all().order_by("id") + assert ( + getattr(rows_refreshed[0], field.db_column) + == "Generated with temperature None: Empty Test" + ) + assert getattr(rows_refreshed[1], field.db_column) == pre_filled_value # Unchanged + assert ( + getattr(rows_refreshed[2], field.db_column) + == "Generated with temperature None: Empty Test" + ) + + +@pytest.mark.django_db +@pytest.mark.field_ai +@patch("baserow.contrib.database.rows.signals.rows_updated.send") +def test_job_execution_only_empty_table_mode( + patched_rows_updated, premium_data_fixture +): + """Test only_empty flag in TABLE mode.""" + + premium_data_fixture.register_fake_generate_ai_type() + user = premium_data_fixture.create_user() + database = premium_data_fixture.create_database_application(user=user) + table = premium_data_fixture.create_database_table(database=database) + field = premium_data_fixture.create_ai_field(table=table, ai_prompt="'Fill Empty'") + + RowHandler().create_rows(user, table, rows_values=[{}, {}, {}]) + + # Pre-fill middle row + model = table.get_model() + middle_row = model.objects.all()[1] + setattr(middle_row, field.db_column, "Already filled") + middle_row.save() + + job = JobHandler().create_and_start_job( + user, "generate_ai_values", sync=True, field_id=field.id, only_empty=True + ) + + assert job.state == "finished" + assert patched_rows_updated.call_count == 2 # Only 2 empty rows + + +@pytest.mark.django_db +@pytest.mark.field_ai +@patch("baserow.contrib.database.rows.signals.rows_updated.send") +def test_job_execution_only_empty_view_mode(patched_rows_updated, premium_data_fixture): + """Test only_empty flag in VIEW mode.""" + + premium_data_fixture.register_fake_generate_ai_type() + user = premium_data_fixture.create_user() + database = premium_data_fixture.create_database_application(user=user) + table = premium_data_fixture.create_database_table(database=database) + field = premium_data_fixture.create_ai_field(table=table, ai_prompt="'Test'") + view = premium_data_fixture.create_grid_view(table=table) + + RowHandler().create_rows(user, table, rows_values=[{}, {}, {}]) + + # Pre-fill one row + model = table.get_model() + second_row = model.objects.all()[1] + setattr(second_row, field.db_column, "Filled") + second_row.save() + + job = JobHandler().create_and_start_job( + user, + "generate_ai_values", + sync=True, + field_id=field.id, + view_id=view.id, + only_empty=True, + ) + + assert job.state == "finished" + assert patched_rows_updated.call_count == 2 # Only empty rows in view + + +@pytest.mark.django_db +@pytest.mark.field_ai +@patch("baserow.contrib.database.rows.signals.rows_updated.send") +def test_job_execution_empty_string_vs_null(patched_rows_updated, premium_data_fixture): + """ + Test that only_empty treats both NULL and empty string as empty. + Using TABLE mode since only_empty has a bug with ROWS mode. + """ + + premium_data_fixture.register_fake_generate_ai_type() + user = premium_data_fixture.create_user() + database = premium_data_fixture.create_database_application(user=user) + table = premium_data_fixture.create_database_table(database=database) + field = premium_data_fixture.create_ai_field(table=table, ai_prompt="'Test'") + + RowHandler().create_rows(user, table, rows_values=[{}, {}, {}]) + + model = table.get_model() + rows = list(model.objects.all().order_by("id")) + + # First row: NULL (default) + # Second row: empty string + rows[1].refresh_from_db() + setattr(rows[1], field.db_column, "") + rows[1].save() + # Third row: has value - use the field model to properly set it + rows[2].refresh_from_db() + setattr(rows[2], field.db_column, "Has value") + rows[2].save() + + # Verify the values were set correctly before running job + rows[2].refresh_from_db() + assert getattr(rows[2], field.db_column) == "Has value" + + # Use TABLE mode instead of ROWS mode to avoid the bug + job = JobHandler().create_and_start_job( + user, + "generate_ai_values", + sync=True, + field_id=field.id, + only_empty=True, + ) + + assert job.state == "finished" + + # Verify third row still has its original value (wasn't overwritten) + rows[2].refresh_from_db() + value_after_job = getattr(rows[2], field.db_column) + # If only_empty works, this should still be "Has value", not the generated value + assert ( + value_after_job == "Has value" + ), f"Expected 'Has value' but got '{value_after_job}'" + + +@pytest.mark.django_db +@pytest.mark.field_ai +@patch("baserow.contrib.database.rows.signals.rows_ai_values_generation_error.send") +def test_job_execution_handles_errors(patched_error_signal, premium_data_fixture): + """Test that job handles errors gracefully.""" + + premium_data_fixture.register_fake_generate_ai_type() + user = premium_data_fixture.create_user() + database = premium_data_fixture.create_database_application(user=user) + table = premium_data_fixture.create_database_table(database=database) + field = premium_data_fixture.create_ai_field( + table=table, + ai_prompt="'Test'", + ai_generative_ai_type="test_generative_ai_prompt_error", + ) + + rows = RowHandler().create_rows(user, table, rows_values=[{}]).created_rows + + from baserow.core.generative_ai.exceptions import GenerativeAIPromptError + + with pytest.raises(GenerativeAIPromptError): + JobHandler().create_and_start_job( + user, + "generate_ai_values", + sync=True, + field_id=field.id, + row_ids=[rows[0].id], + ) + + # Error signal should have been sent + assert patched_error_signal.call_count == 1 + assert patched_error_signal.call_args[1]["field"] == field + assert "Test error" in patched_error_signal.call_args[1]["error_message"] + + +@pytest.mark.django_db +@pytest.mark.field_ai +def test_job_progress_tracking(premium_data_fixture): + """Test that job tracks progress correctly during execution.""" + + premium_data_fixture.register_fake_generate_ai_type() + user = premium_data_fixture.create_user() + database = premium_data_fixture.create_database_application(user=user) + table = premium_data_fixture.create_database_table(database=database) + field = premium_data_fixture.create_ai_field(table=table, ai_prompt="'Progress'") + + # Create multiple rows to see progress + RowHandler().create_rows(user, table, rows_values=[{} for _ in range(5)]) + + job = JobHandler().create_and_start_job( + user, "generate_ai_values", sync=True, field_id=field.id + ) + + # After completion, should be at 100% + assert job.progress_percentage == 100 + assert job.state == "finished" diff --git a/premium/backend/tests/baserow_premium_tests/fields/test_generate_ai_values_job_type.py b/premium/backend/tests/baserow_premium_tests/fields/test_generate_ai_values_job_type.py new file mode 100644 index 0000000000..5a88daec52 --- /dev/null +++ b/premium/backend/tests/baserow_premium_tests/fields/test_generate_ai_values_job_type.py @@ -0,0 +1,968 @@ +""" +Tests for GenerateAIValuesJob creation, validation, and job limiting. +""" +from io import BytesIO +from unittest.mock import patch + +from django.test.utils import override_settings + +import pytest +from baserow_premium.fields.models import GenerateAIValuesJob + +from baserow.contrib.database.fields.exceptions import FieldDoesNotExist +from baserow.contrib.database.fields.handler import FieldHandler +from baserow.contrib.database.rows.exceptions import RowDoesNotExist +from baserow.contrib.database.rows.handler import RowHandler +from baserow.contrib.database.views.exceptions import ViewDoesNotExist +from baserow.core.generative_ai.exceptions import GenerativeAIPromptError +from baserow.core.jobs.exceptions import MaxJobCountExceeded +from baserow.core.jobs.handler import JobHandler +from baserow.core.storage import get_default_storage +from baserow.core.user_files.handler import UserFileHandler + + +@pytest.mark.django_db +@pytest.mark.field_ai +def test_create_job_rows_mode(premium_data_fixture): + """Test job creation in ROWS mode with row_ids parameter.""" + + premium_data_fixture.register_fake_generate_ai_type() + user = premium_data_fixture.create_user() + database = premium_data_fixture.create_database_application(user=user) + table = premium_data_fixture.create_database_table(database=database) + field = premium_data_fixture.create_ai_field(table=table, ai_prompt="'test'") + + rows = RowHandler().create_rows(user, table, rows_values=[{}, {}, {}]).created_rows + row_ids = [row.id for row in rows] + + job = JobHandler().create_and_start_job( + user, + "generate_ai_values", + field_id=field.id, + row_ids=row_ids, + ) + + assert job.field_id == field.id + assert job.row_ids == row_ids + assert job.view_id is None + assert job.only_empty is False + assert job.mode == GenerateAIValuesJob.MODES.ROWS + + +@pytest.mark.django_db +@pytest.mark.field_ai +def test_create_job_view_mode(premium_data_fixture): + """Test job creation in VIEW mode with view_id parameter.""" + + premium_data_fixture.register_fake_generate_ai_type() + user = premium_data_fixture.create_user() + database = premium_data_fixture.create_database_application(user=user) + table = premium_data_fixture.create_database_table(database=database) + field = premium_data_fixture.create_ai_field(table=table, ai_prompt="'test'") + view = premium_data_fixture.create_grid_view(table=table) + + # Create some rows + RowHandler().create_rows(user, table, rows_values=[{}, {}]) + + job = JobHandler().create_and_start_job( + user, + "generate_ai_values", + field_id=field.id, + view_id=view.id, + ) + + assert job.field_id == field.id + assert job.row_ids is None + assert job.view_id == view.id + assert job.only_empty is False + assert job.mode == GenerateAIValuesJob.MODES.VIEW + + +@pytest.mark.django_db +@pytest.mark.field_ai +def test_create_job_table_mode(premium_data_fixture): + """Test job creation in TABLE mode without row_ids or view_id.""" + + premium_data_fixture.register_fake_generate_ai_type() + user = premium_data_fixture.create_user() + database = premium_data_fixture.create_database_application(user=user) + table = premium_data_fixture.create_database_table(database=database) + field = premium_data_fixture.create_ai_field(table=table, ai_prompt="'test'") + + # Create some rows + RowHandler().create_rows(user, table, rows_values=[{}, {}, {}]) + + job = JobHandler().create_and_start_job( + user, + "generate_ai_values", + field_id=field.id, + ) + + assert job.field_id == field.id + assert job.row_ids is None + assert job.view_id is None + assert job.only_empty is False + assert job.mode == GenerateAIValuesJob.MODES.TABLE + + +@pytest.mark.django_db +@pytest.mark.field_ai +def test_create_job_with_only_empty_flag_rows_mode(premium_data_fixture): + """Test job creation with only_empty=True in ROWS mode.""" + + premium_data_fixture.register_fake_generate_ai_type() + user = premium_data_fixture.create_user() + database = premium_data_fixture.create_database_application(user=user) + table = premium_data_fixture.create_database_table(database=database) + field = premium_data_fixture.create_ai_field(table=table, ai_prompt="'test'") + + rows = RowHandler().create_rows(user, table, rows_values=[{}, {}]).created_rows + row_ids = [row.id for row in rows] + + job = JobHandler().create_and_start_job( + user, + "generate_ai_values", + field_id=field.id, + row_ids=row_ids, + only_empty=True, + ) + + assert job.only_empty is True + assert job.mode == GenerateAIValuesJob.MODES.ROWS + + +@pytest.mark.django_db +@pytest.mark.field_ai +def test_create_job_with_only_empty_flag_view_mode(premium_data_fixture): + """Test job creation with only_empty=True in VIEW mode.""" + + premium_data_fixture.register_fake_generate_ai_type() + user = premium_data_fixture.create_user() + database = premium_data_fixture.create_database_application(user=user) + table = premium_data_fixture.create_database_table(database=database) + field = premium_data_fixture.create_ai_field(table=table, ai_prompt="'test'") + view = premium_data_fixture.create_grid_view(table=table) + + RowHandler().create_rows(user, table, rows_values=[{}]) + + job = JobHandler().create_and_start_job( + user, + "generate_ai_values", + field_id=field.id, + view_id=view.id, + only_empty=True, + ) + + assert job.only_empty is True + assert job.mode == GenerateAIValuesJob.MODES.VIEW + + +@pytest.mark.django_db +@pytest.mark.field_ai +def test_create_job_with_only_empty_flag_table_mode(premium_data_fixture): + """Test job creation with only_empty=True in TABLE mode.""" + + premium_data_fixture.register_fake_generate_ai_type() + user = premium_data_fixture.create_user() + database = premium_data_fixture.create_database_application(user=user) + table = premium_data_fixture.create_database_table(database=database) + field = premium_data_fixture.create_ai_field(table=table, ai_prompt="'test'") + + RowHandler().create_rows(user, table, rows_values=[{}]) + + job = JobHandler().create_and_start_job( + user, + "generate_ai_values", + field_id=field.id, + only_empty=True, + ) + + assert job.only_empty is True + assert job.mode == GenerateAIValuesJob.MODES.TABLE + + +@pytest.mark.django_db +@pytest.mark.field_ai +def test_create_job_with_nonexistent_field(premium_data_fixture): + """Test that creating a job with non-existent field_id raises FieldDoesNotExist.""" + + premium_data_fixture.register_fake_generate_ai_type() + user = premium_data_fixture.create_user() + + with pytest.raises(FieldDoesNotExist): + JobHandler().create_and_start_job( + user, + "generate_ai_values", + field_id=99999, + ) + + +@pytest.mark.django_db +@pytest.mark.field_ai +def test_create_job_with_nonexistent_view(premium_data_fixture): + """Test that creating a job with non-existent view_id raises ViewDoesNotExist.""" + + premium_data_fixture.register_fake_generate_ai_type() + user = premium_data_fixture.create_user() + database = premium_data_fixture.create_database_application(user=user) + table = premium_data_fixture.create_database_table(database=database) + field = premium_data_fixture.create_ai_field(table=table, ai_prompt="'test'") + + with pytest.raises(ViewDoesNotExist): + JobHandler().create_and_start_job( + user, + "generate_ai_values", + field_id=field.id, + view_id=99999, + ) + + +@pytest.mark.django_db +@pytest.mark.field_ai +def test_create_job_with_nonexistent_rows(premium_data_fixture): + """Test that creating a job with non-existent row_ids raises RowDoesNotExist.""" + + premium_data_fixture.register_fake_generate_ai_type() + user = premium_data_fixture.create_user() + database = premium_data_fixture.create_database_application(user=user) + table = premium_data_fixture.create_database_table(database=database) + field = premium_data_fixture.create_ai_field(table=table, ai_prompt="'test'") + + with pytest.raises(RowDoesNotExist): + JobHandler().create_and_start_job( + user, + "generate_ai_values", + field_id=field.id, + row_ids=[99999, 88888], + ) + + +@pytest.mark.django_db +@pytest.mark.field_ai +def test_create_job_with_partial_invalid_rows(premium_data_fixture): + """Test that job creation fails if some row_ids don't exist.""" + + premium_data_fixture.register_fake_generate_ai_type() + user = premium_data_fixture.create_user() + database = premium_data_fixture.create_database_application(user=user) + table = premium_data_fixture.create_database_table(database=database) + field = premium_data_fixture.create_ai_field(table=table, ai_prompt="'test'") + + rows = RowHandler().create_rows(user, table, rows_values=[{}]).created_rows + valid_row_id = rows[0].id + + with pytest.raises(RowDoesNotExist): + JobHandler().create_and_start_job( + user, + "generate_ai_values", + field_id=field.id, + row_ids=[valid_row_id, 99999], + ) + + +@pytest.mark.django_db +@pytest.mark.field_ai +@pytest.mark.parametrize("params", [lambda view: {}, lambda view: {"view_id": view.id}]) +def test_job_limiting_table_or_view_mode(premium_data_fixture, params): + premium_data_fixture.register_fake_generate_ai_type() + user = premium_data_fixture.create_user() + database = premium_data_fixture.create_database_application(user=user) + table = premium_data_fixture.create_database_table(database=database) + view = premium_data_fixture.create_grid_view(table=table) + field = premium_data_fixture.create_ai_field(table=table, ai_prompt="'test'") + field_2 = premium_data_fixture.create_ai_field(table=table, ai_prompt="'test2'") + + RowHandler().create_rows(user, table, rows_values=[{}]) + # Manually create a job that won't run + GenerateAIValuesJob.objects.create(user=user, field=field) + + # 2nd job should fail + with pytest.raises(MaxJobCountExceeded): + JobHandler().create_and_start_job( + user, + "generate_ai_values", + field_id=field.id, + **params(view), + sync=True, + ) + + # It should be possible to schedule a job for a different field on the same table + JobHandler().create_and_start_job( + user, + "generate_ai_values", + field_id=field_2.id, + **params(view), + sync=True, + ) + + # But it should be possible to schedule 2 more jobs for different tables + table_2 = premium_data_fixture.create_database_table(database=database) + view_2 = premium_data_fixture.create_grid_view(table=table_2) + field_2 = premium_data_fixture.create_ai_field(table=table_2, ai_prompt="'test'") + + # This should work on a different table + JobHandler().create_and_start_job( + user, + "generate_ai_values", + field_id=field_2.id, + **params(view_2), + sync=True, + ) + # Manually create a job that won't run + GenerateAIValuesJob.objects.create(user=user, field=field_2) + # Another job on the same table should fail again + with pytest.raises(MaxJobCountExceeded): + JobHandler().create_and_start_job( + user, + "generate_ai_values", + field_id=field_2.id, + **params(view_2), + sync=True, + ) + + table_3 = premium_data_fixture.create_database_table(database=database) + view_3 = premium_data_fixture.create_grid_view(table=table_3) + field_3 = premium_data_fixture.create_ai_field(table=table_3, ai_prompt="'test'") + JobHandler().create_and_start_job( + user, + "generate_ai_values", + field_id=field_3.id, + **params(view_3), + sync=True, + ) + # Manually create a job that won't run + GenerateAIValuesJob.objects.create(user=user, field=field_3) + # Another job on the same table should fail again + with pytest.raises(MaxJobCountExceeded): + JobHandler().create_and_start_job( + user, + "generate_ai_values", + field_id=field_3.id, + **params(view_3), + sync=True, + ) + + table_4 = premium_data_fixture.create_database_table(database=database) + view_4 = premium_data_fixture.create_grid_view(table=table_4) + field_4 = premium_data_fixture.create_ai_field(table=table_4, ai_prompt="'test'") + # No more than 3 total concurrent jobs should be allowed, so this should fail + with pytest.raises(MaxJobCountExceeded): + JobHandler().create_and_start_job( + user, + "generate_ai_values", + field_id=field_4.id, + **params(view_4), + sync=True, + ) + + +@pytest.mark.django_db +@pytest.mark.field_ai +def test_job_limiting_not_applied_to_rows_mode(premium_data_fixture): + """Test that job limiting is NOT applied to ROWS mode.""" + + premium_data_fixture.register_fake_generate_ai_type() + user = premium_data_fixture.create_user() + database = premium_data_fixture.create_database_application(user=user) + table = premium_data_fixture.create_database_table(database=database) + field = premium_data_fixture.create_ai_field(table=table, ai_prompt="'test'") + + rows = ( + RowHandler() + .create_rows(user, table, rows_values=[{} for _ in range(10)]) + .created_rows + ) + + # Should be able to create more than 5 jobs in ROWS mode + for i in range(7): + job = JobHandler().create_and_start_job( + user, + "generate_ai_values", + field_id=field.id, + row_ids=[rows[i].id], + sync=True, + ) + assert job is not None + + +@pytest.mark.django_db +@pytest.mark.field_ai +def test_create_job_view_mode_with_different_table_view(premium_data_fixture): + """Test that creating a job with a view from a different table fails.""" + + premium_data_fixture.register_fake_generate_ai_type() + user = premium_data_fixture.create_user() + database = premium_data_fixture.create_database_application(user=user) + table1 = premium_data_fixture.create_database_table(database=database) + table2 = premium_data_fixture.create_database_table(database=database) + field = premium_data_fixture.create_ai_field(table=table1, ai_prompt="'test'") + view_in_table2 = premium_data_fixture.create_grid_view(table=table2) + + with pytest.raises(ViewDoesNotExist): + JobHandler().create_and_start_job( + user, + "generate_ai_values", + field_id=field.id, + view_id=view_in_table2.id, + ) + + +@pytest.mark.django_db +@pytest.mark.field_ai +def test_mode_property_returns_correct_mode(premium_data_fixture): + """Test that the mode property correctly identifies the job mode.""" + + premium_data_fixture.register_fake_generate_ai_type() + user = premium_data_fixture.create_user() + database = premium_data_fixture.create_database_application(user=user) + table = premium_data_fixture.create_database_table(database=database) + field = premium_data_fixture.create_ai_field(table=table, ai_prompt="'test'") + view = premium_data_fixture.create_grid_view(table=table) + + rows = RowHandler().create_rows(user, table, rows_values=[{}]).created_rows + + # Test ROWS mode + job_rows = JobHandler().create_and_start_job( + user, + "generate_ai_values", + field_id=field.id, + row_ids=[rows[0].id], + sync=True, + ) + assert job_rows.mode == GenerateAIValuesJob.MODES.ROWS + + # Test VIEW mode + job_view = JobHandler().create_and_start_job( + user, + "generate_ai_values", + field_id=field.id, + view_id=view.id, + sync=True, + ) + assert job_view.mode == GenerateAIValuesJob.MODES.VIEW + + # Test TABLE mode + job_table = JobHandler().create_and_start_job( + user, + "generate_ai_values", + field_id=field.id, + sync=True, + ) + assert job_table.mode == GenerateAIValuesJob.MODES.TABLE + + +@pytest.mark.django_db +@pytest.mark.field_ai +@patch("baserow.contrib.database.rows.signals.rows_updated.send") +def test_generate_ai_field_value_view_generative_ai( + patched_rows_updated, premium_data_fixture +): + premium_data_fixture.register_fake_generate_ai_type() + user = premium_data_fixture.create_user( + email="test@test.nl", password="password", first_name="Test1" + ) + + database = premium_data_fixture.create_database_application( + user=user, name="database" + ) + table = premium_data_fixture.create_database_table(name="table", database=database) + field = premium_data_fixture.create_ai_field( + table=table, name="ai", ai_prompt="'Hello'" + ) + + rows = RowHandler().create_rows(user, table, rows_values=[{}]).created_rows + + assert patched_rows_updated.call_count == 0 + JobHandler().create_and_start_job( + user, "generate_ai_values", sync=True, field_id=field.id, row_ids=[rows[0].id] + ) + assert patched_rows_updated.call_count == 1 + updated_row = patched_rows_updated.call_args[1]["rows"][0] + assert ( + getattr(updated_row, field.db_column) + == "Generated with temperature None: Hello" + ) + assert patched_rows_updated.call_args[1]["updated_field_ids"] == set([field.id]) + + +@pytest.mark.django_db +@pytest.mark.field_ai +@patch("baserow.contrib.database.rows.signals.rows_updated.send") +def test_generate_ai_field_value_view_generative_ai_with_temperature( + patched_rows_updated, premium_data_fixture +): + premium_data_fixture.register_fake_generate_ai_type() + user = premium_data_fixture.create_user( + email="test@test.nl", password="password", first_name="Test1" + ) + + database = premium_data_fixture.create_database_application( + user=user, name="database" + ) + table = premium_data_fixture.create_database_table(name="table", database=database) + field = premium_data_fixture.create_ai_field( + table=table, name="ai", ai_prompt="'Hello'", ai_temperature=0.7 + ) + + rows = RowHandler().create_rows(user, table, rows_values=[{}]).created_rows + + JobHandler().create_and_start_job( + user, "generate_ai_values", sync=True, field_id=field.id, row_ids=[rows[0].id] + ) + updated_row = patched_rows_updated.call_args[1]["rows"][0] + assert ( + getattr(updated_row, field.db_column) == "Generated with temperature 0.7: Hello" + ) + + +@pytest.mark.django_db +@pytest.mark.field_ai +@patch("baserow.contrib.database.rows.signals.rows_updated.send") +def test_generate_ai_field_value_view_generative_ai_parse_formula( + patched_rows_updated, premium_data_fixture +): + premium_data_fixture.register_fake_generate_ai_type() + user = premium_data_fixture.create_user( + email="test@test.nl", password="password", first_name="Test1" + ) + + database = premium_data_fixture.create_database_application( + user=user, name="database" + ) + table = premium_data_fixture.create_database_table(name="table", database=database) + firstname = premium_data_fixture.create_text_field(table=table, name="firstname") + lastname = premium_data_fixture.create_text_field(table=table, name="lastname") + formula = f"concat('Hello ', get('fields.field_{firstname.id}'), ' ', get('fields.field_{lastname.id}'))" + field = premium_data_fixture.create_ai_field( + table=table, name="ai", ai_prompt=formula + ) + + rows = ( + RowHandler() + .create_rows( + user, + table, + rows_values=[ + {f"field_{firstname.id}": "Bram", f"field_{lastname.id}": "Wiepjes"}, + ], + ) + .created_rows + ) + + assert patched_rows_updated.call_count == 0 + JobHandler().create_and_start_job( + user, "generate_ai_values", sync=True, field_id=field.id, row_ids=[rows[0].id] + ) + assert patched_rows_updated.call_count == 1 + updated_row = patched_rows_updated.call_args[1]["rows"][0] + assert ( + getattr(updated_row, field.db_column) + == "Generated with temperature None: Hello Bram Wiepjes" + ) + assert patched_rows_updated.call_args[1]["updated_field_ids"] == set([field.id]) + + +@pytest.mark.django_db +@pytest.mark.field_ai +@patch("baserow.contrib.database.rows.signals.rows_updated.send") +def test_generate_ai_field_value_view_generative_ai_invalid_field( + patched_rows_updated, premium_data_fixture +): + premium_data_fixture.register_fake_generate_ai_type() + user = premium_data_fixture.create_user( + email="test@test.nl", password="password", first_name="Test1" + ) + + database = premium_data_fixture.create_database_application( + user=user, name="database" + ) + table = premium_data_fixture.create_database_table(name="table", database=database) + firstname = premium_data_fixture.create_text_field(table=table, name="firstname") + formula = "concat('Hello ', get('fields.field_0'))" + field = premium_data_fixture.create_ai_field( + table=table, name="ai", ai_prompt=formula + ) + + rows = ( + RowHandler() + .create_rows( + user, + table, + rows_values=[{f"field_{firstname.id}": "Bram"}], + ) + .created_rows + ) + assert patched_rows_updated.call_count == 0 + JobHandler().create_and_start_job( + user, "generate_ai_values", sync=True, field_id=field.id, row_ids=[rows[0].id] + ) + assert patched_rows_updated.call_count == 1 + updated_row = patched_rows_updated.call_args[1]["rows"][0] + assert ( + getattr(updated_row, field.db_column) + == "Generated with temperature None: Hello " + ) + + +@pytest.mark.django_db +@pytest.mark.field_ai +@patch("baserow.contrib.database.rows.signals.rows_ai_values_generation_error.send") +@patch("baserow.contrib.database.rows.signals.rows_updated.send") +def test_generate_ai_field_value_view_generative_ai_invalid_prompt( + patched_rows_updated, patched_rows_ai_values_generation_error, premium_data_fixture +): + premium_data_fixture.register_fake_generate_ai_type() + user = premium_data_fixture.create_user( + email="test@test.nl", password="password", first_name="Test1" + ) + + database = premium_data_fixture.create_database_application( + user=user, name="database" + ) + table = premium_data_fixture.create_database_table(name="table", database=database) + firstname = premium_data_fixture.create_text_field(table=table, name="firstname") + formula = "concat('Hello ', get('fields.field_0'))" + field = premium_data_fixture.create_ai_field( + table=table, + name="ai", + ai_generative_ai_type="test_generative_ai_prompt_error", + ai_prompt=formula, + ) + + rows = ( + RowHandler() + .create_rows( + user, + table, + rows_values=[{f"field_{firstname.id}": "Bram"}], + ) + .created_rows + ) + + assert patched_rows_ai_values_generation_error.call_count == 0 + + with pytest.raises(GenerativeAIPromptError): + JobHandler().create_and_start_job( + user, + "generate_ai_values", + sync=True, + field_id=field.id, + row_ids=[rows[0].id], + ) + + assert patched_rows_updated.call_count == 0 + assert patched_rows_ai_values_generation_error.call_count == 1 + call_args_rows = patched_rows_ai_values_generation_error.call_args[1]["rows"] + assert ( + len(call_args_rows) == 0 + ) # Changed because rows is passed as empty list in job_types.py:220 + assert patched_rows_ai_values_generation_error.call_args[1]["field"] == field + assert ( + patched_rows_ai_values_generation_error.call_args[1]["error_message"] + == "Test error" + ) + + +@pytest.mark.django_db +@pytest.mark.field_ai +@patch("baserow.contrib.database.rows.signals.rows_updated.send") +def test_generate_ai_field_value_view_generative_ai_with_files( + patched_rows_updated, premium_data_fixture +): + storage = get_default_storage() + + premium_data_fixture.register_fake_generate_ai_type() + user = premium_data_fixture.create_user( + email="test@test.nl", password="password", first_name="Test1" + ) + database = premium_data_fixture.create_database_application( + user=user, name="database" + ) + table = premium_data_fixture.create_database_table(name="table", database=database) + file_field = premium_data_fixture.create_file_field( + table=table, order=0, name="File" + ) + field = premium_data_fixture.create_ai_field( + table=table, + name="ai", + ai_generative_ai_type="test_generative_ai_with_files", + ai_prompt="'Test prompt'", + ai_file_field=file_field, + ) + table_model = table.get_model() + user_file_1 = UserFileHandler().upload_user_file( + user, "aifile.txt", BytesIO(b"Text in file"), storage=storage + ) + values = {f"field_{file_field.id}": [{"name": user_file_1.name}]} + row = RowHandler().force_create_row( + user, + table, + values, + table_model, + ) + + assert patched_rows_updated.call_count == 0 + JobHandler().create_and_start_job( + user, "generate_ai_values", sync=True, field_id=field.id, row_ids=[row.id] + ) + assert patched_rows_updated.call_count == 1 + updated_row = patched_rows_updated.call_args[1]["rows"][0] + assert "Generated with files" in getattr(updated_row, field.db_column) + assert "Test prompt" in getattr(updated_row, field.db_column) + assert patched_rows_updated.call_args[1]["updated_field_ids"] == set([field.id]) + + +@pytest.mark.django_db(transaction=True) +@pytest.mark.field_ai +@override_settings(DEBUG=True) +@patch("baserow.core.jobs.handler.JobHandler.create_and_start_job") +def test_generate_ai_field_value_no_auto_update( + patched_job_creation, premium_data_fixture +): + premium_data_fixture.register_fake_generate_ai_type() + user = premium_data_fixture.create_user( + email="test@test.nl", password="password", first_name="Test1" + ) + + database = premium_data_fixture.create_database_application( + user=user, name="database" + ) + table = premium_data_fixture.create_database_table(name="table", database=database) + text_field = premium_data_fixture.create_text_field(table=table, name="text") + ai_field = FieldHandler().create_field( + table=table, + user=user, + name="ai", + type_name="ai", + ai_generative_ai_type="test_generative_ai", + ai_generative_ai_model="test_1", + ai_prompt=f"get('fields.field_{text_field.id}')", + ai_temperature=0.7, + ai_auto_update=False, + ) + + RowHandler().create_rows( + user, + table, + rows_values=[{text_field.db_column: "test"}], + send_webhook_events=False, + send_realtime_update=False, + ).created_rows + + assert patched_job_creation.call_count == 0 + + +@pytest.mark.django_db(transaction=True) +@pytest.mark.field_ai +@override_settings(DEBUG=True) +@patch("baserow.core.jobs.handler.JobHandler.create_and_start_job") +def test_generate_ai_field_value_auto_update( + patched_job_creation, premium_data_fixture +): + premium_data_fixture.register_fake_generate_ai_type() + user = premium_data_fixture.create_user( + email="test@test.nl", + password="password", + first_name="Test1", + has_active_premium_license=True, + ) + + database = premium_data_fixture.create_database_application( + user=user, name="database" + ) + table = premium_data_fixture.create_database_table(name="table", database=database) + text_field = premium_data_fixture.create_text_field(table=table, name="text") + ai_field = FieldHandler().create_field( + table=table, + user=user, + name="ai", + type_name="ai", + ai_generative_ai_type="test_generative_ai", + ai_generative_ai_model="test_1", + ai_prompt=f"get('fields.field_{text_field.id}')", + ai_temperature=0.7, + ai_auto_update=True, + ) + + rows = ( + RowHandler() + .create_rows( + user, + table, + rows_values=[{text_field.db_column: "test"}], + send_webhook_events=False, + send_realtime_update=False, + ) + .created_rows + ) + + assert patched_job_creation.call_count == 1 + + call_args = patched_job_creation.call_args + # Verify job was created with correct parameters + assert call_args.args[0] == user + assert call_args.args[1] == "generate_ai_values" + assert call_args.kwargs["field_id"] == ai_field.id + assert call_args.kwargs["row_ids"] == [r.id for r in rows] + + +@pytest.mark.django_db(transaction=True) +@pytest.mark.field_ai +@override_settings(DEBUG=True) +@patch("baserow.core.jobs.handler.JobHandler.create_and_start_job") +def test_generate_ai_field_value_auto_update_no_license_user( + patched_job_creation, premium_data_fixture +): + premium_data_fixture.register_fake_generate_ai_type() + user = premium_data_fixture.create_user( + email="test@test.nl", password="password", first_name="Test1" + ) + + database = premium_data_fixture.create_database_application( + user=user, name="database" + ) + table = premium_data_fixture.create_database_table(name="table", database=database) + text_field = premium_data_fixture.create_text_field(table=table, name="text") + # user has no license, but the license check is done before so this will create + # a field with auto update enabled for a user without license. + ai_field = FieldHandler().create_field( + table=table, + user=user, + name="ai", + type_name="ai", + ai_generative_ai_type="test_generative_ai", + ai_generative_ai_model="test_1", + ai_prompt=f"get('fields.field_{text_field.id}')", + ai_temperature=0.7, + ai_auto_update=True, + ) + + rows = ( + RowHandler() + .create_rows( + user, + table, + rows_values=[{text_field.db_column: "test"}], + send_webhook_events=False, + send_realtime_update=False, + ) + .created_rows + ) + + # On the first attempt the license check will fail and the auto update will be + # disabled. + assert patched_job_creation.call_count == 0 + ai_field.refresh_from_db() + assert ai_field.ai_auto_update is False + + +@pytest.mark.django_db(transaction=True) +@pytest.mark.field_ai +@override_settings(DEBUG=True) +def test_generate_ai_field_no_user_task_executed(premium_data_fixture): + premium_data_fixture.register_fake_generate_ai_type() + user = premium_data_fixture.create_user( + email="test@test.nl", + password="password", + first_name="Test1", + has_active_premium_license=True, + ) + + database = premium_data_fixture.create_database_application( + user=user, name="database" + ) + table = premium_data_fixture.create_database_table(name="table", database=database) + text_field = premium_data_fixture.create_text_field(table=table, name="text") + ai_field = FieldHandler().create_field( + table=table, + user=user, + name="ai", + type_name="ai", + ai_generative_ai_type="test_generative_ai", + ai_generative_ai_model="test_1", + ai_prompt=f"get('fields.field_{text_field.id}')", + ai_temperature=0.7, + ai_auto_update=True, + ) + + rows = ( + RowHandler() + .create_rows( + user, + table, + rows_values=[{text_field.db_column: "test text value"}], + send_webhook_events=False, + send_realtime_update=False, + ) + .created_rows + ) + + row = rows[0] + row.refresh_from_db() + + assert ( + getattr(row, ai_field.db_column) + == "Generated with temperature 0.7: test text value" + ) + + +@pytest.mark.django_db(transaction=True) +@pytest.mark.field_ai +@override_settings(DEBUG=True) +def test_generate_ai_field_auto_update_without_user(premium_data_fixture): + premium_data_fixture.register_fake_generate_ai_type() + user = premium_data_fixture.create_user( + email="test@test.nl", + password="password", + first_name="Test1", + has_active_premium_license=True, + ) + other_user = premium_data_fixture.create_user( + email="test2@test.nl", + password="password", + first_name="Test2", + has_active_premium_license=True, + ) + + workspace = premium_data_fixture.create_workspace(users=[user, other_user]) + database = premium_data_fixture.create_database_application( + workspace=workspace, name="database" + ) + + table = premium_data_fixture.create_database_table(name="table", database=database) + text_field = premium_data_fixture.create_text_field(table=table, name="text") + ai_field = FieldHandler().create_field( + table=table, + user=user, + name="ai", + type_name="ai", + ai_generative_ai_type="test_generative_ai", + ai_generative_ai_model="test_1", + ai_prompt=f"get('fields.field_{text_field.id}')", + ai_temperature=0.7, + ai_auto_update=True, + ) + + assert ai_field.ai_auto_update_user_id == user.id + user.delete() + ai_field.refresh_from_db() + assert ai_field.ai_auto_update_user_id is None + + rows = ( + RowHandler() + .create_rows( + other_user, + table, + rows_values=[{text_field.db_column: "test text value"}], + send_webhook_events=False, + send_realtime_update=False, + ) + .created_rows + ) + + row = rows[0] + row.refresh_from_db() + + assert getattr(row, ai_field.db_column) is None + ai_field.refresh_from_db() + assert ai_field.ai_auto_update is False diff --git a/premium/web-frontend/modules/baserow_premium/components/field/GenerateAIValuesContextItem.vue b/premium/web-frontend/modules/baserow_premium/components/field/GenerateAIValuesContextItem.vue new file mode 100644 index 0000000000..b7b69b76b5 --- /dev/null +++ b/premium/web-frontend/modules/baserow_premium/components/field/GenerateAIValuesContextItem.vue @@ -0,0 +1,102 @@ + + + diff --git a/premium/web-frontend/modules/baserow_premium/components/field/GenerateAIValuesForm.vue b/premium/web-frontend/modules/baserow_premium/components/field/GenerateAIValuesForm.vue new file mode 100644 index 0000000000..e0ab0cfead --- /dev/null +++ b/premium/web-frontend/modules/baserow_premium/components/field/GenerateAIValuesForm.vue @@ -0,0 +1,119 @@ + + + diff --git a/premium/web-frontend/modules/baserow_premium/components/field/GenerateAIValuesFormFooter.vue b/premium/web-frontend/modules/baserow_premium/components/field/GenerateAIValuesFormFooter.vue new file mode 100644 index 0000000000..ab6ef278e5 --- /dev/null +++ b/premium/web-frontend/modules/baserow_premium/components/field/GenerateAIValuesFormFooter.vue @@ -0,0 +1,58 @@ + + + diff --git a/premium/web-frontend/modules/baserow_premium/components/field/GenerateAIValuesModal.vue b/premium/web-frontend/modules/baserow_premium/components/field/GenerateAIValuesModal.vue new file mode 100644 index 0000000000..1b4e0dbeb1 --- /dev/null +++ b/premium/web-frontend/modules/baserow_premium/components/field/GenerateAIValuesModal.vue @@ -0,0 +1,152 @@ + + + diff --git a/premium/web-frontend/modules/baserow_premium/components/row/RowEditFieldAI.vue b/premium/web-frontend/modules/baserow_premium/components/row/RowEditFieldAI.vue index 00a83720e4..c9cbead192 100644 --- a/premium/web-frontend/modules/baserow_premium/components/row/RowEditFieldAI.vue +++ b/premium/web-frontend/modules/baserow_premium/components/row/RowEditFieldAI.vue @@ -25,11 +25,12 @@ >
{{ $t('rowEditFieldAI.createRowBefore') }}
diff --git a/premium/web-frontend/modules/baserow_premium/components/views/grid/fields/GridViewFieldAI.vue b/premium/web-frontend/modules/baserow_premium/components/views/grid/fields/GridViewFieldAI.vue index 4ff02fa825..ad71c019cd 100644 --- a/premium/web-frontend/modules/baserow_premium/components/views/grid/fields/GridViewFieldAI.vue +++ b/premium/web-frontend/modules/baserow_premium/components/views/grid/fields/GridViewFieldAI.vue @@ -48,11 +48,12 @@ diff --git a/premium/web-frontend/modules/baserow_premium/fieldContextItemTypes.js b/premium/web-frontend/modules/baserow_premium/fieldContextItemTypes.js new file mode 100644 index 0000000000..0556600fe3 --- /dev/null +++ b/premium/web-frontend/modules/baserow_premium/fieldContextItemTypes.js @@ -0,0 +1,12 @@ +import { Registerable } from '@baserow/modules/core/registry' +import GenerateAIValuesContextItem from '@baserow_premium/components/field/GenerateAIValuesContextItem' + +export class GenerateAIValuesContextItemType extends Registerable { + static getType() { + return 'generate_ai_values' + } + + getComponent() { + return GenerateAIValuesContextItem + } +} diff --git a/premium/web-frontend/modules/baserow_premium/jobTypes.js b/premium/web-frontend/modules/baserow_premium/jobTypes.js new file mode 100644 index 0000000000..1837e74ad1 --- /dev/null +++ b/premium/web-frontend/modules/baserow_premium/jobTypes.js @@ -0,0 +1,16 @@ +import { JobType } from '@baserow/modules/core/jobTypes' + +export class GenerateAIValuesJobType extends JobType { + static getType() { + return 'generate_ai_values' + } + + getIconClass() { + return 'iconoir-magic-wand' + } + + getName() { + const { i18n } = this.app + return i18n.t('jobType.generateAIValues') + } +} diff --git a/premium/web-frontend/modules/baserow_premium/locales/en.json b/premium/web-frontend/modules/baserow_premium/locales/en.json index 1ed81f3e93..c82b0e15d9 100644 --- a/premium/web-frontend/modules/baserow_premium/locales/en.json +++ b/premium/web-frontend/modules/baserow_premium/locales/en.json @@ -372,5 +372,22 @@ "true": "true", "false": "false", "other": "Other" + }, + "generateAIValuesModal": { + "title": "Generate all AI values" + }, + "generateAIValuesForm": { + "scopeLabel": "Scope", + "entireTable": "Entire table", + "skipPopulated": "Generate only values for empty cells", + "warningTitle": "Token Usage Warning", + "warningMessage": "Geenerating all AI values will consume API tokens and may take substantial time depending on the number of rows." + }, + "generateAIValuesFormFooter": { + "generate": "Generate with AI", + "close": "Close" + }, + "jobType": { + "generateAIValues": "Regenerate AI field values" } } diff --git a/premium/web-frontend/modules/baserow_premium/plugin.js b/premium/web-frontend/modules/baserow_premium/plugin.js index d4ed2be84e..dc9ff0b2db 100644 --- a/premium/web-frontend/modules/baserow_premium/plugin.js +++ b/premium/web-frontend/modules/baserow_premium/plugin.js @@ -65,6 +65,8 @@ import { PieChartWidgetType, } from '@baserow_premium/dashboard/widgetTypes' import { SingleSelectFormattingType } from '@baserow_premium/dashboard/chartFieldFormatting' +import { GenerateAIValuesJobType } from '@baserow_premium/jobTypes' +import { GenerateAIValuesContextItemType } from '@baserow_premium/fieldContextItemTypes' import en from '@baserow_premium/locales/en.json' import fr from '@baserow_premium/locales/fr.json' import nl from '@baserow_premium/locales/nl.json' @@ -223,6 +225,14 @@ export default (context) => { 'aiFieldOutputType', new ChoiceAIFieldOutputType(context) ) + + app.$registry.register('job', new GenerateAIValuesJobType(context)) + + app.$registry.register( + 'fieldContextItem', + new GenerateAIValuesContextItemType(context) + ) + app.$registry.register( 'groupedAggregation', new MinViewAggregationType(context) diff --git a/premium/web-frontend/modules/baserow_premium/services/field.js b/premium/web-frontend/modules/baserow_premium/services/field.js index db89216de0..0a964a03e6 100644 --- a/premium/web-frontend/modules/baserow_premium/services/field.js +++ b/premium/web-frontend/modules/baserow_premium/services/field.js @@ -17,5 +17,24 @@ export default (client) => { } ) }, + generateAIValues(fieldId, { viewId, rowIds, onlyEmpty }) { + const payload = { + type: 'generate_ai_values', + field_id: fieldId, + only_empty: onlyEmpty || false, + } + + // Only include view_id if provided + if (viewId) { + payload.view_id = viewId + } + + // Only include row_ids if provided and not empty + if (rowIds && rowIds.length > 0) { + payload.row_ids = rowIds + } + + return client.post(`/jobs/`, payload) + }, } } diff --git a/web-frontend/modules/core/assets/scss/components/modal-progress.scss b/web-frontend/modules/core/assets/scss/components/modal-progress.scss index 317d4bc444..d3780ee0ee 100644 --- a/web-frontend/modules/core/assets/scss/components/modal-progress.scss +++ b/web-frontend/modules/core/assets/scss/components/modal-progress.scss @@ -29,6 +29,12 @@ position: absolute; } -.modal-progress__export-button { +.modal-progress__export-button, +.modal-progress__primary-button { flex: 0 0 160px; } + +.modal-progress__cancel-button { + margin-right: 12px; + color: $color-error-500; +} diff --git a/web-frontend/modules/database/locales/en.json b/web-frontend/modules/database/locales/en.json index 667d5cbe5c..0329240e61 100644 --- a/web-frontend/modules/database/locales/en.json +++ b/web-frontend/modules/database/locales/en.json @@ -686,6 +686,7 @@ "copyCells": "Copy cells", "copyCellsWithHeader": "Copy cells with header", "generateCellsValues": "Generate values with AI", + "generateAllAiValues": "Generate all AI values", "rowCount": "No rows | 1 row | {count} rows", "hiddenRowsInsertedTitle": "Rows added", "hiddenRowsInsertedMessage": "{number} newly added rows have been added, but are not visible because of the active filters.", From 0caef8f5cdd86784ffeb38a3ecd02077273ad383 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20Pardou?= <571533+jrmi@users.noreply.github.com> Date: Fri, 14 Nov 2025 12:00:48 +0100 Subject: [PATCH 07/13] Fix reactivity issue with formula input field in automations (#4248) --- .../store/automationWorkflowNode.js | 24 +++++++------------ .../components/formula/FormulaInputField.vue | 2 +- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/web-frontend/modules/automation/store/automationWorkflowNode.js b/web-frontend/modules/automation/store/automationWorkflowNode.js index 077f75afec..ae140187a1 100644 --- a/web-frontend/modules/automation/store/automationWorkflowNode.js +++ b/web-frontend/modules/automation/store/automationWorkflowNode.js @@ -20,8 +20,9 @@ const updateContext = { const updateCachedValues = (workflow) => { if (!workflow || !workflow.nodes) return - workflow.nodeMap = Object.fromEntries( - workflow.nodes.map((node) => [`${node.id}`, node]) + Object.assign( + workflow.nodeMap, + Object.fromEntries(workflow.nodes.map((node) => [`${node.id}`, node])) ) } @@ -43,18 +44,11 @@ const mutations = { state, { workflow, node: nodeToUpdate, values, override = false } ) { - workflow.nodes.forEach((node) => { - if (node.id === nodeToUpdate.id) { - const newValue = override - ? populateNode(values) - : { - ...node, - ...values, - } - Object.assign(node, newValue) - } - }) - updateCachedValues(workflow) + if (override) { + workflow.nodeMap[nodeToUpdate.id] = populateNode(values) + } else { + Object.assign(workflow.nodeMap[nodeToUpdate.id], values) + } }, DELETE_ITEM(state, { workflow, nodeId }) { const nodeIdStr = nodeId.toString() @@ -235,7 +229,7 @@ const actions = { { workflow, node, values } ) { // These values should not be updated via a regular update request - const excludeValues = ['order'] + const excludeValues = ['id'] const oldValues = {} Object.keys(values).forEach((name) => { diff --git a/web-frontend/modules/core/components/formula/FormulaInputField.vue b/web-frontend/modules/core/components/formula/FormulaInputField.vue index 2c0b13a0df..933aa721f4 100644 --- a/web-frontend/modules/core/components/formula/FormulaInputField.vue +++ b/web-frontend/modules/core/components/formula/FormulaInputField.vue @@ -312,7 +312,7 @@ export default { }, }, watch: { - nodesHierarchy(newValue, oldValue) { + nodesHierarchy() { // fixes reactivity issue with components in tiptap by forcing the input to // render. this.key += 1 From 0c0ed17fafb5f8239e77247e40daa0923e6be2ed Mon Sep 17 00:00:00 2001 From: Jonathan Adeline Date: Fri, 14 Nov 2025 15:11:06 +0400 Subject: [PATCH 08/13] Advanced formula editor enhancements (#4246) * handle logical operator * fix linebreak management * fix i18n key * fix doFunc function * display linebreak as a ... linebreak * fix test * fix premium and entreprise test config * fix linebreak in advanced mode --- enterprise/web-frontend/jest.config.js | 5 +- premium/web-frontend/jest.config.js | 5 +- tests/cases/tip_tap_visitor_cases.json | 3 +- .../formula/GetFormulaComponent.vue | 4 +- .../formula/OperatorDetectionExtension.js | 78 +++++++++---------- .../core/formula/parser/javascriptExecutor.js | 4 + .../core/formula/tiptap/fromTipTapVisitor.js | 12 ++- .../core/formula/tiptap/toTipTapVisitor.js | 9 ++- .../modules/core/runtimeFormulaTypes.js | 8 ++ 9 files changed, 73 insertions(+), 55 deletions(-) diff --git a/enterprise/web-frontend/jest.config.js b/enterprise/web-frontend/jest.config.js index 1fa3678b9b..cecfbb0c01 100644 --- a/enterprise/web-frontend/jest.config.js +++ b/enterprise/web-frontend/jest.config.js @@ -4,7 +4,7 @@ module.exports = { displayName: 'enterprise-unit', testEnvironment: 'jsdom', testMatch: ['/test/unit/**/*.spec.js'], - moduleFileExtensions: ['js', 'json', 'vue'], + moduleFileExtensions: ['js', 'json', 'vue', '.mjs'], moduleDirectories: [ path.join(__dirname, '/../../web-frontend/node_modules/'), ], @@ -27,7 +27,7 @@ module.exports = { ), }, transform: { - '^.+\\.js$': [ + '^.+\\.(mjs|js)$': [ 'babel-jest', { configFile: path.join(__dirname, '/../../web-frontend/babel.config.js'), @@ -37,6 +37,7 @@ module.exports = { '^.+\\.(gif|ico|jpg|jpeg|png|svg)$': '../../web-frontend/test/helpers/stubFileTransformer.js', }, + transformIgnorePatterns: ['/node_modules/(?!@nuxtjs/composition-api)'], setupFilesAfterEnv: [ path.join(__dirname, '/../../enterprise/web-frontend/jest.setup.js'), ], diff --git a/premium/web-frontend/jest.config.js b/premium/web-frontend/jest.config.js index 202f63dc8c..a8736bc8e0 100644 --- a/premium/web-frontend/jest.config.js +++ b/premium/web-frontend/jest.config.js @@ -4,7 +4,7 @@ module.exports = { displayName: 'premium-unit', testEnvironment: 'jsdom', testMatch: ['/test/unit/**/*.spec.js'], - moduleFileExtensions: ['js', 'json', 'vue'], + moduleFileExtensions: ['js', 'json', 'vue', '.mjs'], moduleDirectories: [ path.join(__dirname, '/../../web-frontend/node_modules/'), ], @@ -31,7 +31,7 @@ module.exports = { ), }, transform: { - '^.+\\.js$': [ + '^.+\\.(mjs|js)$': [ 'babel-jest', { configFile: path.join(__dirname, '/../../web-frontend/babel.config.js'), @@ -41,6 +41,7 @@ module.exports = { '^.+\\.(gif|ico|jpg|jpeg|png|svg)$': '../../web-frontend/test/helpers/stubFileTransformer.js', }, + transformIgnorePatterns: ['/node_modules/(?!@nuxtjs/composition-api)'], setupFilesAfterEnv: [ path.join(__dirname, '/../../premium/web-frontend/jest.setup.js'), ], diff --git a/tests/cases/tip_tap_visitor_cases.json b/tests/cases/tip_tap_visitor_cases.json index 86fd9df185..dee731ec2a 100644 --- a/tests/cases/tip_tap_visitor_cases.json +++ b/tests/cases/tip_tap_visitor_cases.json @@ -155,7 +155,8 @@ "type": "wrapper", "content": [ { - "type": "wrapper" + "type": "text", + "text": "\u200B" } ] } diff --git a/web-frontend/modules/core/components/formula/GetFormulaComponent.vue b/web-frontend/modules/core/components/formula/GetFormulaComponent.vue index d09952fa0a..d4a6c205ac 100644 --- a/web-frontend/modules/core/components/formula/GetFormulaComponent.vue +++ b/web-frontend/modules/core/components/formula/GetFormulaComponent.vue @@ -112,9 +112,7 @@ export default { (/^\d+$/.test(identifier) || identifier === '*') ) { translatedParts.push( - identifier === '*' - ? `[${this.$t('getFormulaComponent.all')}]` - : identifier + identifier === '*' ? `[${this.$t('common.all')}]` : identifier ) } else { translatedParts.push(identifier) diff --git a/web-frontend/modules/core/components/formula/OperatorDetectionExtension.js b/web-frontend/modules/core/components/formula/OperatorDetectionExtension.js index 1658672329..19c63df922 100644 --- a/web-frontend/modules/core/components/formula/OperatorDetectionExtension.js +++ b/web-frontend/modules/core/components/formula/OperatorDetectionExtension.js @@ -52,41 +52,43 @@ export const OperatorDetectionExtension = Extension.create({ const { state } = view const { tr, schema } = state - // Check for compound operators by looking at the previous character - const textBefore = state.doc.textBetween(Math.max(0, from - 2), from, '') let operatorText = typedText - let startPos = from // Default: insert at current position (don't replace anything before) - let endPos = from // Default: don't remove anything - - // Handle compound operators (!=, >=, <=) - if (typedText === '=') { - // First, check if there's a text character before - const prevChar = textBefore.charAt(textBefore.length - 1) - if (prevChar === '!' || prevChar === '>' || prevChar === '<') { - operatorText = prevChar + '=' - startPos = from - 2 // Start before the !, > or < - endPos = from // End at current position (don't include the = we're typing) - } else { - // Check if there's an operator node right before the cursor - const $pos = state.doc.resolve(from) - const nodeBefore = $pos.nodeBefore - - if ( - nodeBefore && - nodeBefore.type.name === 'operator-formula-component' - ) { - const prevOperator = nodeBefore.attrs.operatorSymbol - - if ( - (prevOperator === '>' || prevOperator === '<') && - operators.includes(prevOperator + '=') - ) { - // Replace the previous operator node with the compound operator - operatorText = prevOperator + '=' - startPos = from - nodeBefore.nodeSize - endPos = from // Replace up to current position - } - } + let startPos = from + let endPos = from + + // Unified handling for all compound operators (!=, >=, <=, &&, ||) + // Try to form a compound operator by looking at what's before the cursor + + // First, check if there's an operator node right before the cursor + // This has priority because > and < are converted to nodes immediately + const $pos = state.doc.resolve(from) + const nodeBefore = $pos.nodeBefore + + if (nodeBefore && nodeBefore.type.name === 'operator-formula-component') { + const prevOperator = nodeBefore.attrs.operatorSymbol + const potentialFromNode = prevOperator + typedText + + if (operators.includes(potentialFromNode)) { + // Replace the previous operator node with the compound operator + operatorText = potentialFromNode + startPos = from - nodeBefore.nodeSize + endPos = from + } + } else { + // Check for text character before cursor + const prevChar = state.doc.textBetween(Math.max(0, from - 1), from, '') + const potentialOperator = prevChar + typedText + + if (prevChar && operators.includes(potentialOperator)) { + // We can form a compound operator with the previous character + // Only if there actually IS a previous character + operatorText = potentialOperator + startPos = from - 1 + endPos = from + } else if (operators.includes(typedText)) { + // Simple operator (like > or <), no need to look back + operatorText = typedText + // startPos and endPos already set to 'from' } } @@ -137,14 +139,8 @@ export const OperatorDetectionExtension = Extension.create({ return false } - // For '!', we need to wait for the next character to see if it's '!=' - // We don't wait for '>' and '<' because they are valid operators on their own - if (text === '!') { - return false - } - // Handle the operator - return handleOperatorTyped(view, to, to, text) + return handleOperatorTyped(view, from, to, text) }, }, }), diff --git a/web-frontend/modules/core/formula/parser/javascriptExecutor.js b/web-frontend/modules/core/formula/parser/javascriptExecutor.js index 9b4219b1c4..9a0966423b 100644 --- a/web-frontend/modules/core/formula/parser/javascriptExecutor.js +++ b/web-frontend/modules/core/formula/parser/javascriptExecutor.js @@ -68,6 +68,10 @@ export default class JavascriptExecutor extends BaserowFormulaVisitor { formulaFunctionType.validateArgs(args, this.validateArgsType) + if (!this.validateArgsType) { + return null + } + const argsParsed = formulaFunctionType.parseArgs(args) return formulaFunctionType.execute(this.context, argsParsed) diff --git a/web-frontend/modules/core/formula/tiptap/fromTipTapVisitor.js b/web-frontend/modules/core/formula/tiptap/fromTipTapVisitor.js index 5f69cbfdee..b6a846de20 100644 --- a/web-frontend/modules/core/formula/tiptap/fromTipTapVisitor.js +++ b/web-frontend/modules/core/formula/tiptap/fromTipTapVisitor.js @@ -154,7 +154,7 @@ export class FromTipTapVisitor { // In advanced mode, we need to escape actual newlines in the text // to make them valid in string literals - cleanText = cleanText.replace(/\n/g, '\\n') + cleanText = cleanText.replace(/\n/g, '\n') return cleanText } @@ -180,8 +180,12 @@ export class FromTipTapVisitor { } visitHardBreak(node) { - // In advanced mode, convert hard breaks to actual newline characters - // that will be part of the string literal - return '\n' + if (this.mode === 'advanced') { + // In advanced mode, hard breaks are literal newlines inside the text + return '\n' + } else { + // In simple mode, hard breaks represent newline strings in concat + return "'\\n'" + } } } diff --git a/web-frontend/modules/core/formula/tiptap/toTipTapVisitor.js b/web-frontend/modules/core/formula/tiptap/toTipTapVisitor.js index 189a613882..bf12077db2 100644 --- a/web-frontend/modules/core/formula/tiptap/toTipTapVisitor.js +++ b/web-frontend/modules/core/formula/tiptap/toTipTapVisitor.js @@ -49,7 +49,11 @@ export class ToTipTapVisitor extends BaserowFormulaVisitor { switch (ctx.getText()) { case "'\n'": // Specific element that helps to recognize root concat - return { type: 'newLine' } + if (this.mode === 'simple') { + return { type: 'newLine' } + } else { + return { type: 'text', text: "'\n'" } + } default: { if (this.mode === 'advanced') { // In advanced mode, keep quotes for display @@ -92,7 +96,8 @@ export class ToTipTapVisitor extends BaserowFormulaVisitor { if (processedString) { return { type: 'text', text: processedString } } else { - return { type: 'wrapper' } + // Empty strings are represented as a special marker that won't be confused with line breaks + return { type: 'text', text: '\u200B' } // Zero-width space for empty strings } } } diff --git a/web-frontend/modules/core/runtimeFormulaTypes.js b/web-frontend/modules/core/runtimeFormulaTypes.js index c0f6bce558..2a74268426 100644 --- a/web-frontend/modules/core/runtimeFormulaTypes.js +++ b/web-frontend/modules/core/runtimeFormulaTypes.js @@ -1663,6 +1663,10 @@ export class RuntimeAnd extends RuntimeFormulaFunction { return FORMULA_CATEGORY.CONDITION } + get getOperatorSymbol() { + return '&&' + } + get args() { return [ new BooleanBaserowRuntimeFormulaArgumentType(), @@ -1706,6 +1710,10 @@ export class RuntimeOr extends RuntimeFormulaFunction { return FORMULA_CATEGORY.CONDITION } + get getOperatorSymbol() { + return '||' + } + get args() { return [ new BooleanBaserowRuntimeFormulaArgumentType(), From 47a4c0e09308cdd419592d18561d09a6f3193348 Mon Sep 17 00:00:00 2001 From: Bram Date: Fri, 14 Nov 2025 13:00:41 +0100 Subject: [PATCH 09/13] Sync assistant knowledge base with a local file (#4209) * Sync knowledge base with local file * Added latest website_export * Fix tests * Fixed feedback --- .../introduced_sync_knowledge_base.json | 8 + .../backend/src/baserow_enterprise/apps.py | 31 + .../baserow_enterprise/assistant/models.py | 22 +- .../src/baserow_enterprise/assistant/tasks.py | 6 + .../assistant/tools/search_docs/handler.py | 325 +- .../commands/dump_knowledge_base.py | 66 - .../commands/load_knowledge_base.py | 77 - .../commands/sync_knowledge_base.py | 24 + ..._assistant_knowledge_retrieval_commands.py | 183 - ...t_assistant_knowledge_retrieval_handler.py | 109 - .../assistant/test_sync_knowledge_base.py | 352 + enterprise/backend/website_export.csv | 26625 ++++++++++++++++ 12 files changed, 27269 insertions(+), 559 deletions(-) create mode 100644 changelog/entries/unreleased/feature/introduced_sync_knowledge_base.json delete mode 100644 enterprise/backend/src/baserow_enterprise/management/commands/dump_knowledge_base.py delete mode 100644 enterprise/backend/src/baserow_enterprise/management/commands/load_knowledge_base.py create mode 100644 enterprise/backend/src/baserow_enterprise/management/commands/sync_knowledge_base.py create mode 100644 enterprise/backend/tests/baserow_enterprise_tests/assistant/test_sync_knowledge_base.py create mode 100644 enterprise/backend/website_export.csv diff --git a/changelog/entries/unreleased/feature/introduced_sync_knowledge_base.json b/changelog/entries/unreleased/feature/introduced_sync_knowledge_base.json new file mode 100644 index 0000000000..d2c9212748 --- /dev/null +++ b/changelog/entries/unreleased/feature/introduced_sync_knowledge_base.json @@ -0,0 +1,8 @@ +{ + "type": "feature", + "message": "Introduced the ability to sync the knowledge base based on an exportable file.", + "domain": "core", + "issue_number": null, + "bullet_points": [], + "created_at": "2025-11-11" +} diff --git a/enterprise/backend/src/baserow_enterprise/apps.py b/enterprise/backend/src/baserow_enterprise/apps.py index d85972636f..38944c16e2 100755 --- a/enterprise/backend/src/baserow_enterprise/apps.py +++ b/enterprise/backend/src/baserow_enterprise/apps.py @@ -277,6 +277,14 @@ def ready(self): dispatch_uid="sync_default_roles_after_migrate", ) + # Make sure that the assistant knowledge base is up to date after running the + # migrations. + post_migrate.connect( + sync_assistant_knowledge_base, + sender=self, + dispatch_uid="sync_assistant_knowledge_base", + ) + from baserow_enterprise.teams.receivers import ( connect_to_post_delete_signals_to_cascade_deletion_to_team_subjects, ) @@ -345,6 +353,7 @@ def ready(self): # The signals must always be imported last because they use the registries # which need to be filled first. + import baserow_enterprise.assistant.tasks # noqa: F import baserow_enterprise.audit_log.signals # noqa: F import baserow_enterprise.ws.signals # noqa: F @@ -411,3 +420,25 @@ def sync_default_roles_after_migrate(sender, **kwargs): role.operations.remove( *[all_old_operations[op] for op in to_remove], ) + + +def sync_assistant_knowledge_base(sender, **kwargs): + from baserow_enterprise.assistant.tasks import ( + sync_assistant_knowledge_base as sync_assistant_knowledge_base_task, + ) + from baserow_enterprise.assistant.tools.search_docs.handler import ( + KnowledgeBaseHandler, + ) + + if KnowledgeBaseHandler().can_have_knowledge_base(): + print( + "Submitting the sync assistant knowledge base task to run asynchronously " + "in celery after the migration..." + ) + sync_assistant_knowledge_base_task.delay() + else: + print( + "Skipping assistant knowledge base sync because this instance does not " + "have the `BASEROW_EMBEDDINGS_API_URL` environment variable " + "configured or the PostgreSQL server does not have the pgvector extension." + ) diff --git a/enterprise/backend/src/baserow_enterprise/assistant/models.py b/enterprise/backend/src/baserow_enterprise/assistant/models.py index fadc669025..13beff1f0d 100644 --- a/enterprise/backend/src/baserow_enterprise/assistant/models.py +++ b/enterprise/backend/src/baserow_enterprise/assistant/models.py @@ -1,11 +1,8 @@ import uuid from typing import Iterable, NamedTuple -from django.conf import settings from django.contrib.auth import get_user_model from django.db import models -from django.db.models.signals import post_migrate -from django.dispatch import receiver from baserow.core.mixins import BigAutoFieldMixin, CreatedAndUpdatedOnMixin from baserow.core.models import Workspace @@ -192,6 +189,8 @@ class DocumentCategory(NamedTuple): DocumentCategory("premium", "billing"), DocumentCategory("advanced", "billing"), DocumentCategory("enterprise", "billing"), + # FAQ + DocumentCategory("faq", None), ] @@ -392,20 +391,3 @@ class Meta: def natural_key(self): return (self.source_document.slug, self.index) - - -@receiver(post_migrate) -def create_default_knowledge_base_categories(sender, **kwargs): - """ - Create default knowledge base categories if they don't exist. They're needed as - document type importers rely on them. - """ - - from baserow_enterprise.assistant.tools.search_docs.handler import ( - KnowledgeBaseHandler, - ) - - if settings.TESTS: - return - - KnowledgeBaseHandler().load_categories(DEFAULT_CATEGORIES) diff --git a/enterprise/backend/src/baserow_enterprise/assistant/tasks.py b/enterprise/backend/src/baserow_enterprise/assistant/tasks.py index aff4d4eeec..ef72768cfc 100644 --- a/enterprise/backend/src/baserow_enterprise/assistant/tasks.py +++ b/enterprise/backend/src/baserow_enterprise/assistant/tasks.py @@ -3,6 +3,7 @@ from baserow.config.celery import app from .handler import AssistantHandler +from .tools import KnowledgeBaseHandler @app.task(bind=True) @@ -10,6 +11,11 @@ def delete_old_unrated_predictions(self): AssistantHandler().delete_predictions(older_than_days=30, exclude_rated=True) +@app.task(bind=True, queue="export") +def sync_assistant_knowledge_base(self): + KnowledgeBaseHandler().sync_knowledge_base() + + @app.on_after_finalize.connect def setup_period_trash_tasks(sender, **kwargs): sender.add_periodic_task( diff --git a/enterprise/backend/src/baserow_enterprise/assistant/tools/search_docs/handler.py b/enterprise/backend/src/baserow_enterprise/assistant/tools/search_docs/handler.py index 9ac201b260..2596548d2e 100644 --- a/enterprise/backend/src/baserow_enterprise/assistant/tools/search_docs/handler.py +++ b/enterprise/backend/src/baserow_enterprise/assistant/tools/search_docs/handler.py @@ -1,14 +1,16 @@ -from typing import IO, Iterable, Tuple -from zipfile import ZIP_DEFLATED, ZipFile +import csv +from collections import defaultdict +from pathlib import Path +from typing import Iterable, Tuple from django.conf import settings -from django.core import serializers -from django.db.models import Q +from django.db import transaction from httpx import Client as httpxClient from pgvector.django import L2Distance from baserow_enterprise.assistant.models import ( + DEFAULT_CATEGORIES, KnowledgeBaseCategory, KnowledgeBaseChunk, KnowledgeBaseDocument, @@ -152,6 +154,21 @@ def _try_init_vectors(self): KnowledgeBaseChunk.try_init_vector_field() + def can_have_knowledge_base(self): + """ + Indicates whether it's possible for the knowledge base to be populated. In + order to do that, we need a valid embeddings server and PostgreSQL server must + support vectors. + + :return: True if there is an embeddings server and pgvector extension is + enabled. + """ + + return ( + settings.BASEROW_EMBEDDINGS_API_URL != "" + and KnowledgeBaseChunk.can_search_vectors() + ) + def can_search(self) -> bool: """ Returns whether the knowledge base has any documents with status READY that can @@ -162,8 +179,7 @@ def can_search(self) -> bool: """ return ( - settings.BASEROW_EMBEDDINGS_API_URL != "" - and KnowledgeBaseChunk.can_search_vectors() + self.can_have_knowledge_base() and KnowledgeBaseDocument.objects.filter( status=KnowledgeBaseDocument.Status.READY ).exists() @@ -224,121 +240,222 @@ def load_categories(self, categories_serialized: Iterable[Tuple[str, str | None] categories_with_parents, ["parent_id"] ) - def dump_knowledge_base( - self, - buffer_or_filename: IO[str] | str, - document_filters: Q | None = None, - ) -> int: + def sync_knowledge_base(self): """ - Dump the knowledge base into a zip file, containing the serialized - representation of the categories, documents and chunks. + Sync entries from `website_export.csv` with the knowledgebase documents and + chunks. The idea is that this `website_export.csv` file can easily be + exported from the production version of saas. - :param buffer_or_filename: The stream or filename where to write the dump. - :param document_filters: Optional filters to apply to the dumped documents. - :return: The number of dumped documents. + It automatically checks if the entry already exists, and will create, + update or delete accordingly. This will make sure that if a FAQ question is + removed from the source, it will also be removed in the documents. """ - if document_filters is None: - document_filters = Q() - - documents = KnowledgeBaseDocument.objects.filter( - document_filters - ).select_related("category") - - categories = KnowledgeBaseCategory.objects.filter( - id__in=[doc.category_id for doc in documents] - ).select_related("parent__parent__parent__parent") - - chunks = KnowledgeBaseChunk.objects.filter( - source_document__in=documents - ).select_related("source_document") + # Ensure default categories exist (parents set by load_categories) + self.load_categories(DEFAULT_CATEGORIES) - def _serialize(items, fields=None, format_type="jsonl"): - return serializers.serialize( - format_type, - list(items), - use_natural_foreign_keys=True, - use_natural_primary_keys=True, - fields=fields, - ) + csv_path = self._csv_path() + with csv_path.open("r", encoding="utf-8", newline="") as f: + reader = csv.DictReader(f) + rows = [dict(r) for r in reader] - # Avoid serializing the vector field, as it's a copy of the _embedding_array - # field and can cause issues if the pgvector extension is not available at - # import time. - chunk_fields = [ - f.name - for f in KnowledgeBaseChunk._meta.fields - if f.name not in (KnowledgeBaseChunk.VECTOR_FIELD_NAME, "id") - ] - - with ZipFile( - buffer_or_filename, mode="w", compression=ZIP_DEFLATED, allowZip64=True - ) as zip_file: - zip_file.writestr("categories.jsonl", _serialize(categories)) - zip_file.writestr("documents.jsonl", _serialize(documents)) - zip_file.writestr("chunks.jsonl", _serialize(chunks, fields=chunk_fields)) - - return len(documents) - - def load_knowledge_base( - self, - buffer_or_filename: IO[str] | str, - ) -> list[KnowledgeBaseDocument]: - """ - Load a knowledge base from a serialized representation, previously exported with - `dump_knowledge_base`. The existing documents with the same slug will be - replaced, together with their chunks. The categories will be created if they - don't exist yet. Once the knowledge base is loaded, the vector store index will - be synced. - - :param buffer_or_filename: The stream or string containing the serialized - knowledge base data. - :return: The list of loaded KnowledgeBaseDocument instances - """ + if not rows: + return - def _deserialize( - stream: IO[str] | str, format_type="jsonl" - ) -> Iterable[serializers.base.DeserializedObject]: - return serializers.deserialize( - format_type, stream, handle_forward_references=True - ) + pages = {} # (doc_type, slug) -> page dict + slugs_by_type = defaultdict(set) + cat_names = set() + faq_type = KnowledgeBaseDocument.DocumentType.FAQ - categories = [] - documents = [] - chunks = [] + for row in rows: + row_id = row.get("id") or "" + base_slug = row.get("slug") or "" + title = row.get("title") or row.get("name") or "" + body = row.get("markdown_body") or "" + category = row.get("category") or "" + source_url = row.get("source_url") or "" + doc_type = self._csv_type_to_enum(row.get("type")) - with ZipFile(buffer_or_filename, mode="r", allowZip64=True) as zip_file: - categories_data = zip_file.read("categories.jsonl").decode("utf-8") - for obj in _deserialize(categories_data): - categories.append(obj.object) + if not (doc_type and base_slug and title): + continue - self.load_categories( - (cat.name, cat.parent.name if cat.parent else None) - for cat in categories - ) + if doc_type == faq_type: + slug = f"{base_slug}-{row_id}" + else: + slug = base_slug + + key = (doc_type, slug) + pages[key] = { + "title": title, + "body": body, + "category": category, + "source_url": source_url, + "type": doc_type, + } + + slugs_by_type[doc_type].add(slug) + if category: + cat_names.add(category) + + if not pages: + return + + categories = { + c.name: c for c in KnowledgeBaseCategory.objects.filter(name__in=cat_names) + } + + with transaction.atomic(): + types_in_csv = list(slugs_by_type.keys()) + existing = { + (d.type, d.slug): d + for d in KnowledgeBaseDocument.objects.filter(type__in=types_in_csv) + } + + # Deletes the user docs that exist in the KnowledgeBaseDocument, + # but do not exist in the CSV file anymore. This covers the scenario + # where a page is deleted. + for t in types_in_csv: + csv_slugs = slugs_by_type[t] + to_delete = [ + k for k in existing.keys() if k[0] == t and k[1] not in csv_slugs + ] + if to_delete: + KnowledgeBaseDocument.objects.filter( + type=t, slug__in=[s for (_, s) in to_delete] + ).delete() + for k in to_delete: + existing.pop(k, None) + + create, update = [], [] + doc_ids_needing_chunks: set[int] = set() + + for key, p in pages.items(): + category = categories.get(p["category"]) if p["category"] else None + d = existing.get(key) + if d: + changed = False + body_changed = False + if d.title != p["title"]: + d.title = p["title"] + changed = True + if d.raw_content != p["body"]: + d.raw_content = p["body"] + changed = True + body_changed = True + if d.content != p["body"]: + d.content = p["body"] + changed = True + body_changed = True + if d.category_id != (category.id if category else None): + d.category = category + changed = True + if d.process_document: + d.process_document = False + changed = True + if d.status != KnowledgeBaseDocument.Status.READY: + d.status = KnowledgeBaseDocument.Status.READY + changed = True + if d.source_url != p["source_url"]: + d.source_url = p["source_url"] + changed = True + + if changed: + update.append(d) + if body_changed: + doc_ids_needing_chunks.add(d.id) + else: + new_doc = KnowledgeBaseDocument( + title=p["title"], + slug=key[1], + type=key[0], + raw_content=p["body"], + process_document=False, + content=p["body"], + status=KnowledgeBaseDocument.Status.READY, + category=category, + source_url=p["source_url"], + ) + create.append(new_doc) + + if create: + KnowledgeBaseDocument.objects.bulk_create(create) + fresh = KnowledgeBaseDocument.objects.filter( + type__in=types_in_csv, slug__in=[d.slug for d in create] + ) + for d in fresh: + existing[(d.type, d.slug)] = d + doc_ids_needing_chunks.add(d.id) + + if update: + # The `updated_on` field is not saved during the bulk update, so we + # would need to pre_save this value before. + for d in update: + d.updated_on = KnowledgeBaseDocument._meta.get_field( + "updated_on" + ).pre_save(d, add=False) + + KnowledgeBaseDocument.objects.bulk_update( + update, + [ + "title", + "raw_content", + "process_document", + "content", + "status", + "category", + "source_url", + "updated_on", + ], + ) - documents_data = zip_file.read("documents.jsonl").decode("utf-8") - for obj in _deserialize(documents_data): - documents.append(obj.object) + # If there are no chunks to rebuild, we can skip the final part because + # there is no need to delete and recreate the missing chunks. + if not doc_ids_needing_chunks: + return - # Delete existing documents with the same slug to avoid conflicts - # This also cascades and deletes their chunks - KnowledgeBaseDocument.objects.filter( - slug__in=[doc.slug for doc in documents] + KnowledgeBaseChunk.objects.filter( + source_document_id__in=list(doc_ids_needing_chunks) ).delete() - KnowledgeBaseDocument.objects.bulk_create(documents) + chunks, texts = [], [] + for (t, s), d in existing.items(): + if d.id not in doc_ids_needing_chunks: + continue + body = pages[(t, s)]["body"] + chunks.append( + KnowledgeBaseChunk( + source_document=d, index=0, content=body, metadata={} + ) + ) + texts.append(body) - chunks_data = zip_file.read("chunks.jsonl").decode("utf-8") - for obj in _deserialize(chunks_data): - chunks.append(obj.object) + if not chunks: + return + embeddings = self.vector_handler.embed_texts(texts) if KnowledgeBaseChunk.can_search_vectors(): - # If the vector field is available, set it from the _embedding_array - # field to ensure data consistency - for chunk in chunks: - chunk.embedding = chunk._embedding_array + for c, e in zip(chunks, embeddings): + c.embedding = list(e) + c._embedding_array = list(e) + else: + for c, e in zip(chunks, embeddings): + c._embedding_array = list(e) KnowledgeBaseChunk.objects.bulk_create(chunks) - return documents + def _csv_path(self): + path = Path(__file__).resolve().parents[5] / "website_export.csv" + + if not path.exists(): + raise FileNotFoundError(f"CSV not found at: {path}") + + return path + + def _csv_type_to_enum(self, csv_value: str | None) -> str: + v = (csv_value or "").strip() + if not v: + return KnowledgeBaseDocument.DocumentType.RAW_DOCUMENT + for dt in KnowledgeBaseDocument.DocumentType: + if v.lower() == dt.value.lower(): + return dt.value + return KnowledgeBaseDocument.DocumentType.RAW_DOCUMENT diff --git a/enterprise/backend/src/baserow_enterprise/management/commands/dump_knowledge_base.py b/enterprise/backend/src/baserow_enterprise/management/commands/dump_knowledge_base.py deleted file mode 100644 index b51ff1d3b7..0000000000 --- a/enterprise/backend/src/baserow_enterprise/management/commands/dump_knowledge_base.py +++ /dev/null @@ -1,66 +0,0 @@ -import os -from pathlib import Path - -from django.core.management.base import BaseCommand, CommandError -from django.db.models import Q - -from loguru import logger - -from baserow_enterprise.assistant.models import KnowledgeBaseDocument -from baserow_enterprise.assistant.tools.search_docs.handler import KnowledgeBaseHandler - - -class Command(BaseCommand): - help = ( - "Dump the knowledge base to a file with optional compression. " - "By default, only documents in READY status are dumped, since they are the only ones " - "used for retrieval." - ) - - def add_arguments(self, parser): - parser.add_argument( - "filename", - type=str, - help="Output filename for the knowledge base dump. It will be saved as a zip file.", - ) - parser.add_argument( - "--force", - action="store_true", - help="Force overwrite of the output file if it already exists.", - ) - parser.add_argument( - "--all", - action="store_true", - help="Dump all documents, including those not in READY status (default: False, only dump READY documents)", - ) - - def handle(self, *args, **options): - filename = options["filename"] - force_overwrite = options["force"] - dump_all = options["all"] - - try: - file_path = Path(filename) - if os.path.exists(file_path) and not force_overwrite: - self.stdout.write( - "Operation cancelled. File already exists. Use --force to overwrite." - ) - return - - handler = KnowledgeBaseHandler() - document_filters = ( - None if dump_all else Q(status=KnowledgeBaseDocument.Status.READY) - ) - document_count = handler.dump_knowledge_base( - file_path, document_filters=document_filters - ) - - self.stdout.write( - self.style.SUCCESS( - f"Successfully dumped {document_count} documents to {filename}" - ) - ) - - except Exception as e: - logger.exception("Failed to dump knowledge base") - raise CommandError(f"Failed to dump knowledge base: {str(e)}") diff --git a/enterprise/backend/src/baserow_enterprise/management/commands/load_knowledge_base.py b/enterprise/backend/src/baserow_enterprise/management/commands/load_knowledge_base.py deleted file mode 100644 index f7d37f41ee..0000000000 --- a/enterprise/backend/src/baserow_enterprise/management/commands/load_knowledge_base.py +++ /dev/null @@ -1,77 +0,0 @@ -from pathlib import Path - -from django.core.management.base import BaseCommand, CommandError -from django.db import transaction - -from loguru import logger - -from baserow_enterprise.assistant.tools.search_docs.handler import KnowledgeBaseHandler - - -class Command(BaseCommand): - help = "Load the knowledge base from a file with optional decompression" - - def add_arguments(self, parser): - parser.add_argument( - "filename", - type=str, - help="Input filename for the knowledge base dump to load. It must be a zip file.", - ) - parser.add_argument( - "--reset", - action="store_true", - help="Clear the entire knowledge base before loading (default: False, only replace documents with same slug)", - ) - - def handle(self, *args, **options): - filename = options["filename"] - reset_kb = options["reset"] - - try: - file_path = Path(filename) - - if not file_path.exists(): - raise CommandError(f"File does not exist: {filename}") - - handler = KnowledgeBaseHandler() - # Clear knowledge base if reset is requested - if reset_kb: - self._clear_knowledge_base() - self.stdout.write(self.style.WARNING("Cleared existing knowledge base")) - - # Load the knowledge base - with transaction.atomic(): - loaded_docs = handler.load_knowledge_base(file_path) - - self.stdout.write( - self.style.SUCCESS( - f"Successfully loaded {len(loaded_docs)} documents from {filename}" - ) - ) - - # Show loaded document details - for doc in loaded_docs: - self.stdout.write(f" - {doc.title} (slug: {doc.slug})") - - except Exception as e: - logger.exception("Failed to load knowledge base") - raise CommandError(f"Failed to load knowledge base: {str(e)}") - - def _clear_knowledge_base(self): - from baserow_enterprise.assistant.models import ( - KnowledgeBaseCategory, - KnowledgeBaseChunk, - KnowledgeBaseDocument, - ) - - # Delete all documents (this will cascade to chunks) - KnowledgeBaseChunk.objects.all().delete() - documents_count, _ = KnowledgeBaseDocument.objects.all().delete() - - # Delete all categories - categories_count = KnowledgeBaseCategory.objects.count() - KnowledgeBaseCategory.objects.all().delete() - - self.stdout.write( - f"Deleted {documents_count} documents and {categories_count} categories" - ) diff --git a/enterprise/backend/src/baserow_enterprise/management/commands/sync_knowledge_base.py b/enterprise/backend/src/baserow_enterprise/management/commands/sync_knowledge_base.py new file mode 100644 index 0000000000..acb5d265c0 --- /dev/null +++ b/enterprise/backend/src/baserow_enterprise/management/commands/sync_knowledge_base.py @@ -0,0 +1,24 @@ +from django.core.management.base import BaseCommand + +from baserow_enterprise.assistant.tools.search_docs.handler import KnowledgeBaseHandler + + +class Command(BaseCommand): + help = ( + "Sync the knowledge base with the latest data from the website_export.csv " + "file in the repository." + ) + + def handle(self, *args, **options): + handler = KnowledgeBaseHandler() + + if handler.can_have_knowledge_base(): + handler.sync_knowledge_base() + else: + self.stdout.write( + self.style.WARNING( + f"This instance does not have the `BASEROW_EMBEDDINGS_API_URL` " + f"environment variable configured or the PostgreSQL server does " + f"not have the pgvector extension." + ) + ) diff --git a/enterprise/backend/tests/baserow_enterprise_tests/assistant/test_assistant_knowledge_retrieval_commands.py b/enterprise/backend/tests/baserow_enterprise_tests/assistant/test_assistant_knowledge_retrieval_commands.py index b6e6b938b4..6d896fbbab 100644 --- a/enterprise/backend/tests/baserow_enterprise_tests/assistant/test_assistant_knowledge_retrieval_commands.py +++ b/enterprise/backend/tests/baserow_enterprise_tests/assistant/test_assistant_knowledge_retrieval_commands.py @@ -1,9 +1,3 @@ -import tempfile -import zipfile -from pathlib import Path - -from django.core.management import call_command - import pytest from baserow_enterprise.assistant.models import ( @@ -94,180 +88,3 @@ def multiple_document_data(self): "processing_document": processing_document, "processing_chunk": processing_chunk, } - - def test_dump_and_load_basic(self, single_document_data): - """Test basic dump and load functionality with zip files""" - - with tempfile.NamedTemporaryFile(suffix=".zip", delete=False) as f: - temp_file = f.name - - try: - # Dump - call_command("dump_knowledge_base", temp_file, force=True) - - # Verify file is a valid zip file - with zipfile.ZipFile(temp_file, "r") as zf: - assert len(zf.namelist()) > 0 - - # Clear database - KnowledgeBaseDocument.objects.all().delete() - KnowledgeBaseCategory.objects.all().delete() - - # Load - call_command("load_knowledge_base", temp_file) - - # Verify - assert KnowledgeBaseCategory.objects.filter(name="Test Category").exists() - assert KnowledgeBaseDocument.objects.filter(slug="test-doc").exists() - assert KnowledgeBaseChunk.objects.filter( - content="Test chunk content" - ).exists() - - finally: - Path(temp_file).unlink(missing_ok=True) - - def test_dump_with_force_overwrites_existing_file(self, single_document_data): - """Test that --force option overwrites existing files""" - - with tempfile.NamedTemporaryFile(suffix=".zip", delete=False) as f: - temp_file = f.name - - try: - # Create an existing file - with open(temp_file, "w") as f: - f.write("existing content") - - # Dump without --force should fail or warn - # (behavior depends on implementation, but should not overwrite) - result_code = call_command("dump_knowledge_base", temp_file) - - # Now dump with --force should succeed - call_command("dump_knowledge_base", temp_file, force=True) - - # Verify file was overwritten and is now a valid zip - with zipfile.ZipFile(temp_file, "r") as zf: - assert len(zf.namelist()) > 0 - - finally: - Path(temp_file).unlink(missing_ok=True) - - def test_dump_with_all_includes_non_ready_documents(self, multiple_document_data): - """Test that --all option includes documents with non-READY status""" - - with tempfile.NamedTemporaryFile(suffix=".zip", delete=False) as f: - temp_file_normal = f.name - with tempfile.NamedTemporaryFile(suffix=".zip", delete=False) as f: - temp_file_all = f.name - - try: - # Dump without --all (should only include READY documents) - call_command("dump_knowledge_base", temp_file_normal, force=True) - - # Dump with --all (should include all documents) - call_command("dump_knowledge_base", temp_file_all, all=True, force=True) - - # Clear database - KnowledgeBaseDocument.objects.all().delete() - KnowledgeBaseCategory.objects.all().delete() - - # Load normal dump - call_command("load_knowledge_base", temp_file_normal) - - # Should only have ready document - assert KnowledgeBaseDocument.objects.filter(slug="ready-doc").exists() - assert not KnowledgeBaseDocument.objects.filter( - slug="processing-doc" - ).exists() - - # Clear database again - KnowledgeBaseDocument.objects.all().delete() - KnowledgeBaseCategory.objects.all().delete() - - # Load --all dump - call_command("load_knowledge_base", temp_file_all) - - # Should have both documents - assert KnowledgeBaseDocument.objects.filter(slug="ready-doc").exists() - assert KnowledgeBaseDocument.objects.filter(slug="processing-doc").exists() - - finally: - Path(temp_file_normal).unlink(missing_ok=True) - Path(temp_file_all).unlink(missing_ok=True) - - def test_load_with_reset_deletes_existing_documents(self, single_document_data): - """Test that --reset option deletes existing documents before loading""" - - # Create another document that should be deleted - other_category = KnowledgeBaseCategory.objects.create( - name="Other Category", description="Other category" - ) - other_document = KnowledgeBaseDocument.objects.create( - title="Other Document", - slug="other-doc", - raw_content="Other content", - content="Other content", - category=other_category, - ) - - with tempfile.NamedTemporaryFile(suffix=".zip", delete=False) as f: - temp_file = f.name - - try: - # Dump original data - call_command("dump_knowledge_base", temp_file, force=True) - - # Load with --reset - call_command("load_knowledge_base", temp_file, reset=True) - - # Verify original document exists - assert KnowledgeBaseDocument.objects.filter(slug="test-doc").exists() - - # Verify other document was deleted - assert not KnowledgeBaseDocument.objects.filter(slug="other-doc").exists() - assert not KnowledgeBaseCategory.objects.filter( - name="Other Category" - ).exists() - - finally: - Path(temp_file).unlink(missing_ok=True) - - def test_load_without_reset_preserves_existing_documents( - self, single_document_data - ): - """Test that loading without --reset preserves existing documents""" - - # Create another document that should be preserved - other_category = KnowledgeBaseCategory.objects.create( - name="Other Category", description="Other category" - ) - other_document = KnowledgeBaseDocument.objects.create( - title="Other Document", - slug="other-doc", - raw_content="Other content", - content="Other content", - category=other_category, - status=KnowledgeBaseDocument.Status.READY, - ) - - with tempfile.NamedTemporaryFile(suffix=".zip", delete=False) as f: - temp_file = f.name - - try: - # Dump original data (only test-doc) - call_command("dump_knowledge_base", temp_file, force=True) - - # Clear only the test document - KnowledgeBaseDocument.objects.filter(slug="test-doc").delete() - KnowledgeBaseCategory.objects.filter(name="Test Category").delete() - - # Load without --reset - call_command("load_knowledge_base", temp_file) - - # Verify both documents exist - assert KnowledgeBaseDocument.objects.filter(slug="test-doc").exists() - assert KnowledgeBaseDocument.objects.filter(slug="other-doc").exists() - assert KnowledgeBaseCategory.objects.filter(name="Test Category").exists() - assert KnowledgeBaseCategory.objects.filter(name="Other Category").exists() - - finally: - Path(temp_file).unlink(missing_ok=True) diff --git a/enterprise/backend/tests/baserow_enterprise_tests/assistant/test_assistant_knowledge_retrieval_handler.py b/enterprise/backend/tests/baserow_enterprise_tests/assistant/test_assistant_knowledge_retrieval_handler.py index 8ee594485a..7297760d40 100644 --- a/enterprise/backend/tests/baserow_enterprise_tests/assistant/test_assistant_knowledge_retrieval_handler.py +++ b/enterprise/backend/tests/baserow_enterprise_tests/assistant/test_assistant_knowledge_retrieval_handler.py @@ -1,8 +1,5 @@ -from io import BytesIO from unittest.mock import patch -from django.db.models import Q - import numpy as np import pytest @@ -490,112 +487,6 @@ def test_load_categories_handles_missing_parent(self, knowledge_handler): assert child_cat.parent is None # Parent wasn't found assert valid_cat.parent is None - def test_dump_knowledge_base_to_buffer( - self, knowledge_handler, sample_documents_with_chunks - ): - """Test dumping knowledge base to a buffer""" - - documents, chunks = sample_documents_with_chunks - - buffer = BytesIO() - - # Dump to buffer - should return document count - doc_count = knowledge_handler.dump_knowledge_base(buffer) - - assert doc_count == 2 # We have 2 documents - assert buffer.tell() > 0 # Buffer should have data - - def test_dump_knowledge_base_to_file( - self, knowledge_handler, sample_documents_with_chunks - ): - """Test dumping knowledge base to a file""" - - documents, chunks = sample_documents_with_chunks - - import tempfile - - with tempfile.NamedTemporaryFile(suffix=".zip", delete=False) as f: - temp_file = f.name - - try: - # Dump to file - should return document count - doc_count = knowledge_handler.dump_knowledge_base(temp_file) - assert doc_count == 2 - - # File should exist and have content - import os - - assert os.path.exists(temp_file) - assert os.path.getsize(temp_file) > 0 - finally: - import os - - if os.path.exists(temp_file): - os.unlink(temp_file) - - def test_dump_knowledge_base_all_documents( - self, knowledge_handler, sample_documents_with_chunks - ): - """Test dumping all documents when none specified""" - - documents, chunks = sample_documents_with_chunks - - buffer = BytesIO() - - # Dump all documents (no filter) - doc_count = knowledge_handler.dump_knowledge_base(buffer) - - # Should include all documents in the database - assert doc_count >= len(documents) - - def test_dump_knowledge_base_with_filters( - self, knowledge_handler, sample_documents_with_chunks - ): - """Test dumping with document filters""" - - documents, chunks = sample_documents_with_chunks - - buffer = BytesIO() - - # Filter to only include documents with "Database" in title - doc_filter = Q(title__icontains="Database") - doc_count = knowledge_handler.dump_knowledge_base( - buffer, document_filters=doc_filter - ) - - # Should only include 1 document ("Database Guide") - assert doc_count == 1 - - def test_dump_and_load_knowledge_base( - self, knowledge_handler, sample_documents_with_chunks - ): - """Test dumping and then loading knowledge base""" - - documents, chunks = sample_documents_with_chunks - - buffer = BytesIO() - - # First dump the knowledge base - doc_count = knowledge_handler.dump_knowledge_base(buffer) - assert doc_count == 2 - buffer.seek(0) - - # Clear existing data - KnowledgeBaseDocument.objects.all().delete() - KnowledgeBaseCategory.objects.all().delete() - - # Load it back - loaded_docs = knowledge_handler.load_knowledge_base(buffer) - - assert len(loaded_docs) == 2 - assert KnowledgeBaseDocument.objects.count() == 2 - assert KnowledgeBaseChunk.objects.count() == 2 - - # Verify document content was preserved - doc_titles = {doc.title for doc in loaded_docs} - expected_titles = {doc.title for doc in documents} - assert doc_titles == expected_titles - def test_handler_with_default_vector_store(self): """Test handler creation with default vector store""" diff --git a/enterprise/backend/tests/baserow_enterprise_tests/assistant/test_sync_knowledge_base.py b/enterprise/backend/tests/baserow_enterprise_tests/assistant/test_sync_knowledge_base.py new file mode 100644 index 0000000000..e6eddb0e28 --- /dev/null +++ b/enterprise/backend/tests/baserow_enterprise_tests/assistant/test_sync_knowledge_base.py @@ -0,0 +1,352 @@ +import csv +from pathlib import Path + +import pytest + +from baserow.core.pgvector import DEFAULT_EMBEDDING_DIMENSIONS +from baserow_enterprise.assistant.models import ( + DEFAULT_CATEGORIES, + KnowledgeBaseCategory, + KnowledgeBaseChunk, + KnowledgeBaseDocument, +) +from baserow_enterprise.assistant.tools.search_docs.handler import KnowledgeBaseHandler + + +@pytest.fixture +def handler_and_csv(tmp_path, monkeypatch): + csv_path = tmp_path / "website_export.csv" + monkeypatch.setattr(KnowledgeBaseHandler, "_csv_path", lambda self: csv_path) + handler = KnowledgeBaseHandler() + return handler, csv_path + + +def write_csv(path: Path, rows: list[dict]): + headers = [ + "id", + "name", + "slug", + "title", + "markdown_body", + "category", + "type", + "source_url", + ] + with path.open("w", encoding="utf-8", newline="") as f: + w = csv.DictWriter(f, fieldnames=headers) + w.writeheader() + for r in rows: + w.writerow(r) + + +def fake_embed_texts(texts): + return [[0.1] + [0.0] * (DEFAULT_EMBEDDING_DIMENSIONS - 1) for _ in texts] + + +@pytest.mark.django_db +def test_sync_creates_documents_chunks_and_splits_faq(handler_and_csv, monkeypatch): + handler, csv_path = handler_and_csv + + rows = [ + # user docs + { + "id": "1", + "name": "Home", + "slug": "index", + "title": "Home", + "markdown_body": "**test** *yes*", + "category": "workspace", + "type": "baserow_user_docs", + "source_url": "https://baserow.io/user-docs/index", + }, + { + "id": "2", + "name": "category 2", + "slug": "category-2", + "title": "Title 2", + "markdown_body": "> Body 4", + "category": "snapshot", + "type": "baserow_user_docs", + "source_url": "https://baserow.io/user-docs/category-2", + }, + # faq (two separate rows, same base slug 'faq') + { + "id": "1", + "name": "Question 2?", + "slug": "faq", + "title": "Question 2?", + "markdown_body": "Question 2?\n\nAnswer 2", + "category": "faq", + "type": "faq", + "source_url": "https://baserow.io/faq", + }, + { + "id": "2", + "name": "Question 3?", + "slug": "faq", + "title": "Question 3?", + "markdown_body": "Question 3?\n\nAnswer 3", + "category": "faq", + "type": "faq", + "source_url": "https://baserow.io/faq", + }, + ] + write_csv(csv_path, rows) + + monkeypatch.setattr(handler.vector_handler, "embed_texts", fake_embed_texts) + handler.sync_knowledge_base() + + # Documents created + assert KnowledgeBaseDocument.objects.filter( + type="baserow_user_docs", slug="index" + ).exists() + assert KnowledgeBaseDocument.objects.filter( + type="baserow_user_docs", slug="category-2" + ).exists() + + # FAQ should be split into faq-1 and faq-2 + assert KnowledgeBaseDocument.objects.filter(type="faq", slug="faq-1").exists() + assert KnowledgeBaseDocument.objects.filter(type="faq", slug="faq-2").exists() + + # One chunk per document + for d in KnowledgeBaseDocument.objects.all(): + assert KnowledgeBaseChunk.objects.filter(source_document=d).count() == 1 + + # Categories linked by name + assert KnowledgeBaseDocument.objects.get(slug="index").category.name == "workspace" + assert ( + KnowledgeBaseDocument.objects.get(slug="category-2").category.name == "snapshot" + ) + assert KnowledgeBaseDocument.objects.get(slug="faq-1").category.name == "faq" + + +@pytest.mark.django_db +def test_sync_no_reembedding_when_body_unchanged(handler_and_csv, monkeypatch): + handler, csv_path = handler_and_csv + + rows = [ + { + "id": "1", + "name": "Home", + "slug": "index", + "title": "Home", + "markdown_body": "**test** *yes*", + "category": "workspace", + "type": "baserow_user_docs", + "source_url": "https://baserow.io/user-docs/index", + } + ] + write_csv(csv_path, rows) + + monkeypatch.setattr(handler.vector_handler, "embed_texts", fake_embed_texts) + handler.sync_knowledge_base() + + doc = KnowledgeBaseDocument.objects.get(slug="index", type="baserow_user_docs") + chunk_before = KnowledgeBaseChunk.objects.get(source_document=doc) + chunk_before_id = chunk_before.id + + # Second sync with same CSV: ensure embedder is NOT called + monkeypatch.setattr(handler.vector_handler, "embed_texts", fake_embed_texts) + handler.sync_knowledge_base() + + # No new chunks created; existing remains the same id + chunk_after = KnowledgeBaseChunk.objects.get(source_document=doc) + assert chunk_after.id == chunk_before_id + + +@pytest.mark.django_db +def test_sync_reembeds_on_body_change(handler_and_csv, monkeypatch): + handler, csv_path = handler_and_csv + + initial_rows = [ + { + "id": "1", + "name": "Home", + "slug": "index", + "title": "Home", + "markdown_body": "Original body", + "category": "workspace", + "type": "baserow_user_docs", + "source_url": "https://baserow.io/user-docs/index", + } + ] + write_csv(csv_path, initial_rows) + + monkeypatch.setattr(handler.vector_handler, "embed_texts", fake_embed_texts) + handler.sync_knowledge_base() + + doc = KnowledgeBaseDocument.objects.get(slug="index", type="baserow_user_docs") + old_chunk = KnowledgeBaseChunk.objects.get(source_document=doc) + old_chunk_id = old_chunk.id + assert "Original body" in old_chunk.content + + # Update CSV body + updated_rows = [ + { + "id": "1", + "name": "Home", + "slug": "index", + "title": "Home", + "markdown_body": "Updated body text", + "category": "workspace", + "type": "baserow_user_docs", + "source_url": "https://baserow.io/user-docs/index", + } + ] + write_csv(csv_path, updated_rows) + + monkeypatch.setattr(handler.vector_handler, "embed_texts", fake_embed_texts) + handler.sync_knowledge_base() + + # Chunk should be replaced (deleted + created) + new_chunk = KnowledgeBaseChunk.objects.get(source_document=doc) + assert new_chunk.id != old_chunk_id + assert "Updated body text" in new_chunk.content + + +@pytest.mark.django_db +def test_sync_deletes_docs_missing_from_csv_within_same_type( + handler_and_csv, monkeypatch +): + handler, csv_path = handler_and_csv + + rows1 = [ + { + "id": "1", + "name": "Home", + "slug": "index", + "title": "Home", + "markdown_body": "A", + "category": "workspace", + "type": "baserow_user_docs", + "source_url": "https://baserow.io/user-docs/index", + }, + { + "id": "2", + "name": "Page", + "slug": "category-2", + "title": "Page", + "markdown_body": "B", + "category": "snapshot", + "type": "baserow_user_docs", + "source_url": "https://baserow.io/user-docs/category-2", + }, + { + "id": "1", + "name": "Q2", + "slug": "faq", + "title": "Q2", + "markdown_body": "A2", + "category": "faq", + "type": "faq", + "source_url": "https://baserow.io/faq", + }, + ] + write_csv(csv_path, rows1) + + monkeypatch.setattr(handler.vector_handler, "embed_texts", fake_embed_texts) + handler.sync_knowledge_base() + + assert KnowledgeBaseDocument.objects.filter( + type="baserow_user_docs", slug="index" + ).exists() + assert KnowledgeBaseDocument.objects.filter( + type="baserow_user_docs", slug="category-2" + ).exists() + + # Now export contains only user_doc 'category-2' (same type), so 'index' should be + # deleted + rows2 = [ + { + "id": "2", + "name": "Page", + "slug": "category-2", + "title": "Page", + "markdown_body": "B", + "category": "snapshot", + "type": "baserow_user_docs", + "source_url": "https://baserow.io/user-docs/category-2", + }, + { + "id": "1", + "name": "Q2", + "slug": "faq", + "title": "Q2", + "markdown_body": "A2", + "category": "faq", + "type": "faq", + "source_url": "https://baserow.io/faq", + }, + ] + write_csv(csv_path, rows2) + + monkeypatch.setattr(handler.vector_handler, "embed_texts", fake_embed_texts) + handler.sync_knowledge_base() + + assert not KnowledgeBaseDocument.objects.filter( + type="baserow_user_docs", slug="index" + ).exists() + assert KnowledgeBaseDocument.objects.filter( + type="baserow_user_docs", slug="category-2" + ).exists() + + +@pytest.mark.django_db +def test_sync_links_existing_categories(handler_and_csv, monkeypatch): + handler, csv_path = handler_and_csv + handler.load_categories(DEFAULT_CATEGORIES) + + rows = [ + { + "id": "1", + "name": "Home", + "slug": "index", + "title": "Home", + "markdown_body": "Body", + "category": "workspace", + "type": "baserow_user_docs", + "source_url": "https://baserow.io/user-docs/index", + }, + { + "id": "1", + "name": "Q", + "slug": "faq", + "title": "Q", + "markdown_body": "A", + "category": "faq", + "type": "faq", + "source_url": "https://baserow.io/faq", + }, + ] + write_csv(csv_path, rows) + + monkeypatch.setattr(handler.vector_handler, "embed_texts", fake_embed_texts) + handler.sync_knowledge_base() + + assert KnowledgeBaseCategory.objects.filter(name="workspace").exists() + assert KnowledgeBaseCategory.objects.filter(name="faq").exists() + + d1 = KnowledgeBaseDocument.objects.get(type="baserow_user_docs", slug="index") + d2 = KnowledgeBaseDocument.objects.get(type="faq", slug="faq-1") + assert d1.category.name == "workspace" + assert d2.category.name == "faq" + + +@pytest.mark.django_db +def test_sync_knowledge_base_with_real_file(monkeypatch): + handler = KnowledgeBaseHandler() + handler.load_categories(DEFAULT_CATEGORIES) + + monkeypatch.setattr(handler.vector_handler, "embed_texts", fake_embed_texts) + handler.sync_knowledge_base() + + count_documents = KnowledgeBaseDocument.objects.all().count() + count_chunks = KnowledgeBaseChunk.objects.all().count() + + assert count_documents > 100 + assert count_chunks > 100 + + handler.sync_knowledge_base() + + assert count_documents == KnowledgeBaseDocument.objects.all().count() + assert count_chunks == KnowledgeBaseChunk.objects.all().count() diff --git a/enterprise/backend/website_export.csv b/enterprise/backend/website_export.csv new file mode 100644 index 0000000000..e7769c54a0 --- /dev/null +++ b/enterprise/backend/website_export.csv @@ -0,0 +1,26625 @@ +id,name,slug,title,markdown_body,category,type,source_url +1,Quick start with Baserow,how-to-get-started-with-baserow,Get started quickly with Baserow,"# Quick start guide: Get started with Baserow + +This guide maps out your journey from Baserow beginner to power user. Learn the core concepts behind workspaces, databases, applications, dashboards, and automations, then dive into hands-on creation with links to detailed documentation for each step. + +## Your Baserow learning journey + +Baserow gives you four powerful builders that work together inside workspaces: [Database Builder][1] for organizing data, [Application Builder][2] for creating custom apps, [Dashboard Builder][3] for visualizing metrics, and [Automation Builder][4] for streamlining workflows. + +Your first step is understanding how these pieces fit together. This guide shows you the optimal path to learn each one, with practical milestones along the way. + + + +## Understanding the Baserow workspace + +Everything in Baserow lives inside a [workspace][5], your collaborative environment where teams organize projects, databases, applications, dashboards, and automations. + +Inside each workspace, you can create and manage four types of builders that form the foundation of Baserow: + + - **[Database Builder][1]**: Structure and organize your data with tables, fields, and relationships. Databases provide the data foundation. + - **[Application Builder][2]**: Design custom web applications without writing code. Applications present that data to users. + - **[Dashboard Builder][3]**: Create visual analytics and monitoring dashboards. Dashboards visualize performance metrics. + - **[Automation Builder][4]**: Build workflows that connect data, trigger actions, and integrate with external tools. Automations keep everything running smoothly in the background. + +## Step 1: Your account and first workspace + +Before building anything, you need access to Baserow. You can choose [Baserow Cloud][6] for instant access with zero setup, or [install a self-hosted version][7] for complete control over your infrastructure. + +> Cloud is recommended for quick starts, while self-hosting works best for organizations with specific security or compliance requirements. + +Once you're logged in, you'll land on the Baserow dashboard, your home base for accessing everything you create. + +The first time you log in, Baserow may create a default workspace for you, or you can [set up a new workspace][8] from scratch. This is where you'll organize all your databases, applications, dashboards, and automations. + +[Learn how to create and customize workspaces →][8] + +## Step 2: Build your data foundation with databases + +The [Database Builder][1] is where most Baserow users start their journey. Here's why: every application, dashboard, and automation needs data to work with. Your database structure determines what's possible in the other builders. + +A database contains multiple tables, each representing a different type of information. Within each table, you define fields (columns) that specify what information you're tracking: text, numbers, dates, formulas, and more. + +The real power emerges when you create relationships between tables using [link to table fields][9], building a relational structure that mirrors how your business actually works. + +Baserow also offers multiple ways to visualize the same underlying data through [views][10]. The same table can appear as a spreadsheet-like grid for data entry, a kanban board for project management, a calendar for scheduling, a gallery for visual content, or a form for collecting information from others. + +**Start here:** +- [Introduction to databases in Baserow][11] +- [Create a database][12] or [use a template][13] +- [Introduction to tables][14] and [understanding fields][15] +- [Configure different views of your data][16] + +![Baserow database features][17] + +## Step 3: Import existing data + +You don't need to start from scratch. Baserow makes it easy to bring existing data into your workspace from spreadsheets, other databases, or popular tools. [Import CSV files][18], Excel spreadsheets, or JSON data to create new tables or add rows to existing ones. If you're migrating from Airtable, Baserow offers a [specialized import tool][19] that preserves your table structure, field types, and relationships. + +This means you can begin using Baserow immediately with your current data, then gradually build applications, dashboards, and automations on top of that foundation. + +## Step 4: Create custom applications + +Once you have data structured in databases, the [Application Builder][2] lets you turn that data into custom software, such as customer portals, internal admin tools, public-facing websites or specialized tools unique to your business. + +The Application Builder uses a drag-and-drop interface where you add elements to pages - tables, forms, buttons, images, text, and interactive components. Each element connects to your database data through a flexible system of data sources and integrations. + +What makes this powerful is that you're building real applications, not just viewing data. You can publish these applications with custom domains, making them accessible to anyone you choose, team members, customers, or the public. + +**Continue with:** +- [Introduction to Application Builder][20] +- [Create your first application][21] +- [Understanding pages and data sources][22] +- [Working with application elements][23] +- [Preview and publish applications][24] + +![Application Builder core concepts][25] + +## Step 5: Visualize data with dashboards + +The [Dashboard Builder][3] focuses specifically on analytics and monitoring. Dashboards present key metrics, trends, and insights at a glance. + +Dashboards excel at giving teams shared visibility into performance. Each dashboard draws live data from your databases, automatically updating as your underlying data changes. + +**Explore dashboards:** +- [Dashboard Builder documentation][3] +- Connecting database data to visualizations +- [Creating charts and metrics][26] + +## Step 6: Automate workflows + +The [Automation Builder][4] brings everything together by creating workflows that respond to events and connect different systems. + +Automations work with triggers (what starts the workflow), filters (conditions that must be met), and actions (what happens). + +This is where Baserow becomes more than a database or application platform, it becomes a central hub that orchestrates your business processes. Combined with [webhooks][27] and the [Baserow API][28], automations can integrate with thousands of external services. + +**Automate your workflows:** +- [Automation Builder documentation][4] +- [Setting up webhooks][27] +- [Understanding the Baserow API][28] +- [Integration options][29] + +## Step 7: Collaborate with your team + +Baserow shines brightest when teams work together. [Invite collaborators][30] to your workspace and assign roles that control what they can access and modify. + +[Role-based permissions][31] become more sophisticated with paid plans, allowing you to set different access levels at the workspace, database, or even individual table level. This means you can share specific parts of your workspace with external clients, give contractors access to relevant databases only, or ensure sensitive information remains visible to authorized team members. + +You can also [share individual views publicly][32] without requiring recipients to have Baserow accounts. This is perfect for collecting form submissions from customers, sharing read-only reports with stakeholders, or publishing content for public consumption. + +**Collaboration resources:** +- [Working with collaborators in Baserow][33] +- [Understanding permission levels][31] +- [Creating and managing teams][34] +- [Public view sharing][32] + +## Bringing it all together: A complete example + +Here's how these four builders work together in practice. Imagine you're building a customer support system: + +**Database Builder**: Create tables for Tickets, Customers, and Support Agents. Define fields for ticket status, priority, description, timestamps, and relationships linking tickets to customers and agents. + +**Application Builder**: Build a customer portal where clients can submit new tickets through a form, view their open tickets in a table, and see ticket details on individual pages. Create an internal admin tool where support agents can view all tickets, update statuses, add comments, and reassign tickets. + +**Dashboard Builder**: Design a support metrics dashboard showing ticket volume over time, average response times, tickets by priority, agent workload distribution, and customer satisfaction scores. + +**Automation Builder**: Set up workflows that send email notifications when new tickets are created, alert agents when high-priority tickets arrive, automatically update ticket statuses based on certain conditions, and generate weekly reports summarizing support activity. + +Each builder serves its purpose, but together they create a complete, integrated system that would typically require custom software development. + +## Frequently asked questions + +### What should I build first in Baserow? + +Start with the Database Builder to structure your data foundation. Create a few tables with basic fields and relationships that represent real information you need to track. Once you have data organized, experiment with different views to see how the same information can be visualized differently. Then move to building applications or dashboards. + +### How do workspaces, databases, and applications relate to each other? + +Workspaces contain everything, they're the top-level organizational unit. Inside a workspace, you can create multiple databases (each with multiple tables), multiple applications (each with multiple pages), multiple dashboards (each with multiple widgets), and multiple automations (each with multiple workflows). All of these can reference and interact with data from any database in the same workspace. + +### Can I use Baserow without building applications? + +Absolutely. Many users only need the Database Builder for organizing information, using different views to interact with their data. The Application Builder is optional, it's there when you need custom interfaces for specific users or workflows, but the database alone is a complete, powerful tool. + +### Do I need to learn all four builders at once? + +No. The Database Builder is fundamental to everything else. Once you're comfortable creating tables, fields, and views, explore whichever builder solves your most pressing need: applications for custom tools, dashboards for metrics, or automations for efficiency. You can adopt each builder gradually as your needs grow. + +### What's the difference between a view and an application? + +Views are different ways to display and interact with a single table's data within the database itself. Applications are standalone interfaces that can combine data from multiple tables, add custom layouts, implement specific business logic, and be shared with users who never see the underlying database structure. + +### How does Baserow compare to spreadsheets like Excel or Google Sheets? + +Baserow looks similar to spreadsheets but works differently. Spreadsheets are files; Baserow is a relational database. This means you can create relationships between tables, enforce data types, build applications on top of your data, and collaborate with sophisticated permission controls. + +## What's next on your journey + +Choose your next step based on what you want to accomplish: + +**For data organization:** +- [Introduction to databases][11] +- [Understanding field types][15] +- [Working with formulas][35] +- [Filtering and grouping data][36] + +**For building applications:** +- [Application Builder overview][20] +- [Understanding elements][23] +- [Working with data sources][37] +- [User authentication and permissions][38] + +**For analytics and monitoring:** +- [Dashboard Builder guides][3] +- [Field summaries and aggregations][39] +- [Creating charts and visualizations][26] + +**For automation and integration:** +- [Setting up webhooks][27] +- [API documentation][28] +- [Integration platforms][29] +- [Automation Builder guides][4] + +**For team collaboration:** +- [Permission levels explained][31] +- [Creating and managing teams][34] +- [Workspace management][5] + +## Related content + +- [Introduction to Baserow basics][40] +- [Set up Baserow Cloud or Self-hosted][41] +- [Baserow glossary][42] +- [Keyboard shortcuts][43] +- [Browse templates][13] + +--- + + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow.io/user-docs/intro-to-databases + [2]: https://baserow.io/user-docs/application-builder-overview + [3]: https://baserow.io/user-docs/dashboards-overview + [4]: https://baserow.io/user-docs/workflow-automation + [5]: /user-docs/intro-to-workspaces + [6]: /user-docs/set-up-baserow + [7]: /user-docs/set-up-baserow + [8]: /user-docs/setting-up-a-workspace + [9]: /user-docs/link-to-table-field + [10]: /user-docs/overview-of-baserow-views + [11]: /user-docs/intro-to-databases + [12]: /user-docs/create-a-database + [13]: /templates/ + [14]: /user-docs/intro-to-tables + [15]: /user-docs/baserow-field-overview + [16]: /user-docs/create-custom-views-of-your-data + [17]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/74875146-67f4-4c03-b438-22cd5828a932/Database%20features.png + [18]: /user-docs/create-a-table-via-import + [19]: /user-docs/import-airtable-to-baserow + [20]: /user-docs/application-builder-overview + [21]: https://baserow.io/user-docs/create-an-application + [22]: /user-docs/pages-in-the-application-builder + [23]: /user-docs/elements-overview + [24]: /user-docs/preview-and-publish-application + [25]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/b6c815e1-f7d3-472a-bfcc-c8e375f5951d/AB%20Core%20concepts.jpg + [26]: https://baserow.io/user-docs/create-a-dashboard + [27]: /user-docs/webhooks + [28]: /user-docs/database-api + [29]: https://baserow.io/product/integrations + [30]: /user-docs/manage-workspace-permissions + [31]: /user-docs/permissions-overview + [32]: /user-docs/public-sharing + [33]: /user-docs/managing-workspace-collaborators + [34]: /user-docs/create-and-manage-teams + [35]: /user-docs/formula-field-overview + [36]: /user-docs/filters-in-baserow + [37]: /user-docs/data-sources + [38]: /user-docs/user-sources + [39]: /user-docs/footer-aggregation + [40]: /user-docs/baserow-basics + [41]: /user-docs/set-up-baserow + [42]: /user-docs/learn-baserow-basic-concepts + [43]: /user-docs/baserow-keyboard-shortcuts",,baserow_user_docs,https://baserow.io/user-docs/how-to-get-started-with-baserow +2,User guide index,index,Baserow table of contents,"# Baserow user guide index + +Welcome to the Baserow user documentation. Baserow empowers you to create custom databases and applications without writing code. Whether you’re a seasoned professional or just starting, Baserow’s user-friendly interface makes it easy to organize, manage, and analyze your data. + +On this page, you'll find an overview of the main concepts in Baserow. Use the **sidebar navigation** to find support articles within each chapter. + + +## Getting Started + +Before you start creating, it's helpful to understand the basics. This chapter will guide you through the essential building blocks of Baserow and provide information to help you get started, so you're ready to create and manage your data. +* **[Go to Getting Started with Baserow →][1]** + +## Workspaces + +A Workspace is the top-level container for all your projects. In this chapter, we'll cover the basics of managing your Baserow workspace. You'll learn how to create new workspaces, customize their settings, and understand how to collaborate with others. We'll also cover actions like leaving or deleting a workspace, ensuring you have full control over your Baserow environment. +* **[Go to Workspaces →][2]** + + +## The Baserow Builders + +Baserow is built around core modules. + +### Baserow AI +Leverage the power of generative AI directly within Baserow. This section covers how to use the AI prompt field, automatically generate complex formulas from a text description, and write effective prompts to boost your productivity. +* **[Go to Baserow AI →][3]** + +### Database Builder +Baserow makes it easy to create and manage your data. You can create databases from scratch or use templates to get started quickly. This chapter will guide you through the process of creating, importing, and deleting databases in Baserow. + * **[Go to Database Builder →][4]** + +#### Database - Tables +This chapter provides an overview of how to work with tables. Tables are used to store and organize data in Baserow. You can use tables to track customer information, manage projects, store inventory data, sync data from external sources, and more. + * **[Go to Tables →][5]** + +#### Table - Rows +Rows are the building blocks of your tables, representing individual records or entries. This chapter covers everything from creating new rows to customizing their appearance and behavior. You'll learn how to paste data into cells, adjust row height, and add comments or mentions to specific rows. + * **[Go to Rows →][6]** + +#### Table - Fields +Fields are the building blocks of your tables, allowing you to store and organize different types of data. This section covers the basics of creating and configuring fields, as well as advanced features like field summaries, timezones, and value constraints. Explore every field type available in Baserow. From simple Single line text and Number fields to advanced Link-to-table and Rollup fields. + * **[Go to Fields →][7]** + +#### Field - Formula +In this chapter, we'll cover everything you need to know about using formulas in Baserow. Learn how to build powerful expressions to manipulate data, perform calculations, and create advanced logic, from the basics to advanced techniques. + * **[Go to Formula →][8]** + +#### Table - Views +Change how you see your data without altering the underlying information. This section covers creating and customizing views, filtering and grouping rows, applying row coloring, and setting up collaborative or personal views to organize your workflow. Learn about the different ways to visualize your data. This reference guide covers the setup and use cases for Grid view, Gallery view, Form view, Kanban view, Calendar view, and Timeline view. + + * **[Go to Views →][9]** + +### Dashboard Builder +Bring your data to life by creating visual dashboards. This section guides you through creating a dashboard to see all your important metrics, charts, and data points in one place. +* **[Go to Dashboard Builder →][10]** + +### Application Builder +Build custom internal tools, client portals, or web applications on top of your Baserow database without writing code. + +* **[Go to Application Builder →][11]** + +**App Builder Editor**: Learn to use the Application Builder Editor, the user interface you use to create and customize applications. This section explains how to create and manage pages, connect data sources, and configure page-level settings. + +**App Builder Elements**: Applications are built with essential components known as elements. Elements act as the building blocks for your applications and bring functionality and life to your custom-built pages. This reference covers all available elements, from text and buttons to forms and tables. + +### Automation Builder +Create ""if-this-then-that"" style workflows to automate repetitive tasks and integrate with other services. +* **[Go to Automation Builder →][12]** + + +## Platform Administration + +### Data management + +Understand how to manage your data's lifecycle and security. This covers [deleting and recovering data][13] from the trash, managing database [snapshots][14] for backups, and reviewing detailed [audit logs][15]. + +### Collaboration & Permissions +Learn how to manage team members, assign role-based permissions, and share your data publicly or privately. + +**Collaboration**: In this chapter, we'll guide you on how to leverage Baserow to streamline teamwork and boost productivity. Learn how to invite collaborators, manage workspace members, create teams, and share your work publicly. + +* **[Go to Collaboration →][16]** + +**Role-based Permissions**: Role-based access control (RBAC) enables administrators to control and limit data access. This section covers assigning specific roles to users within workspaces, teams, databases, or tables. You can decide who can see and do what in your workspaces. + +* **[Go to Role-based Permissions →][17]** + +### Integrations & API +Connect Baserow to over 4,000 apps using our webhooks, API, and native integrations with tools like Zapier and Make. Baserow takes an API-first approach, providing you with comprehensive API documentation, webhooks, and database tokens. +* **[Go to Integrations & API →][18]** + +### Enterprise, Billing, & Account +Manage your subscription, set up enterprise features like SSO, and configure your personal account settings. + +**Billing**: In this chapter, we'll cover how you can unlock paid features in Baserow by subscribing to a paid plan. Learn how to use and manage your subscriptions to access Baserow's paid features for both cloud and self-hosted instances. + + * **[Go to Billing →][19]** + +**Enterprise License**: Baserow's Enterprise plan is designed for the needs of large teams. It allows teams to build databases, collaborate on projects, and transform manual processes into digital ones with features like an admin panel, audit logs, and more. + + * **[Go to Enterprise License →][20]** + +**Single Sign On (SSO)**: Integrate Single Sign On (SSO) to seamlessly authenticate across various applications and systems. Make the most of your Baserow experience by simplifying authentication with providers like Okta, Azure AD, Google, and more. + + * **[Go to Single Sign On (SSO) →][21]** + +**Account Management**: In this chapter, we'll guide you through managing your Baserow account. This contains information specific to you, like your database tokens, personal account details, password settings, and notification preferences. + + * **[Go to Account Management →][22]** + +--- + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account. + + + [1]: https://baserow.io/user-docs/baserow-basics + [2]: https://baserow.io/user-docs/intro-to-workspaces + [3]: https://baserow.io/user-docs/configure-generative-ai + [4]: https://baserow.io/user-docs/intro-to-databases + [5]: https://baserow.io/user-docs/intro-to-tables + [6]: https://baserow.io/user-docs/overview-of-rows + [7]: https://baserow.io/user-docs/baserow-field-overview + [8]: https://baserow.io/user-docs/formula-field-overview + [9]: https://baserow.io/user-docs/overview-of-baserow-views + [10]: https://baserow.io/user-docs/dashboards-overview + [11]: https://baserow.io/user-docs/application-builder-overview + [12]: https://baserow.io/user-docs/workflow-automation + [13]: https://baserow.io/user-docs/data-recovery-and-deletion + [14]: https://baserow.io/user-docs/snapshots + [15]: https://baserow.io/user-docs/admin-panel-audit-logs + [16]: https://baserow.io/user-docs/managing-workspace-collaborators + [17]: https://baserow.io/user-docs/permissions-overview + [18]: https://baserow.io/user-docs/personal-api-tokens + [19]: https://baserow.io/user-docs/subscriptions-overview + [20]: https://baserow.io/user-docs/enterprise-license-overview + [21]: https://baserow.io/user-docs/single-sign-on-sso-overview + [22]: https://baserow.io/user-docs/account-settings-overview",,baserow_user_docs,https://baserow.io/user-docs/index +4,Baserow glossary,learn-baserow-basic-concepts,Baserow key concepts and glossary,"# Baserow glossary: Key terms and concepts + +This comprehensive glossary explains essential Baserow terminology across all modules: Database Builder, Application Builder, Dashboard Builder, and Automation Builder. Terms are organized by category to help you understand how concepts relate to each other. + +## Understanding Baserow terminology + +Learning Baserow terminology accelerates your ability to use the platform effectively, troubleshoot issues, and collaborate with your team. This glossary covers terms from all Baserow modules, organized by category to show how concepts connect. Whether you're building databases, creating applications, designing dashboards, or automating workflows, these definitions will help you navigate Baserow with confidence. + +![Baserow core concepts visualization][1] + +## Core platform concepts + +These foundational terms apply across all Baserow modules: + +| Term | Definition | +|------|------------| +| **[Workspace][2]** | The top-level organizational container where teams collaborate. Workspaces hold databases, applications, dashboards, and automations. | +| **[Workspace admin][3]** | A user role with full control over workspace management, including adding members, assigning permissions, creating databases and applications, and managing workspace settings. Different from an instance admin. | +| **[Workspace member][3]** | A collaborator who has access to a workspace with specific permissions assigned by workspace admins. | +| **[Billable user][4]** | Any user with access to a workspace who counts toward your subscription's user limit. | +| **[Role-based permissions][5]** | A system for controlling access by assigning roles that determine what users can view and modify. | +| **[Snapshot][20]** | A complete point-in-time backup of your database that can be restored later. | + +## Database Builder terms + +Terms related to organizing and structuring data: + +| Term | Definition | +|------|------------| +| **[Database][6]** | A container for related tables that organize data for specific projects or purposes. A workspace can contain multiple databases. | +| **[Table][7]** | A structured collection of data organized into rows and columns within a database. Each table represents a specific type of information. | +| **[Table ID][8]** | A unique numerical identifier assigned to each table, used for API access and linking tables together. | +| **[Field][9]** | A column in a table that defines a specific type of data to be stored. Each field has a data type (text, number, date, file, etc.) that determines what information it can hold. | +| **[Row][10]** | A single record in a table containing related information across multiple fields. Each row represents one item, person, task, or data point. | +| **[Row ID][10]** | A unique numerical identifier automatically assigned to each row when created. Access using the `row_id()` formula. | +| **[Cell][10]** | The intersection of a row and column where individual data values are stored. Each cell contains one piece of information for one record. | +| **[Link to table field][11]** | A field type that creates relationships between tables, allowing you to connect related data. For example, linking ""Customers"" to ""Orders"" to see which customer placed each order. | +| **Filter** | Criteria applied to show only relevant information, such as date ranges, categories, or specific conditions. | +| **[View][12]** | A customized way of displaying and interacting with table data. The same table can have multiple views (Grid, Gallery, Form, Kanban, Calendar, Timeline) that show data differently without changing the underlying information. | +| **[Grid view][13]** | The default spreadsheet-like view for tables, best for detailed data entry and manipulation. | +| **[Gallery view][14]** | A visual view displaying records as cards with images, ideal for products, portfolios, or any visual content. | +| **[Kanban view][15]** | A board view organizing records as cards in columns based on a single-select field, perfect for workflow management and project tracking. | +| **[Calendar view][16]** | A calendar-based view displaying records with date fields as events, useful for scheduling and deadline tracking. | +| **[Form view][17]** | An interactive form for collecting data from external users who don't need database access. | +| **[Timeline view][18]** | A Gantt-chart-style view showing records with start and end dates along a timeline, ideal for project planning. | +| **[Primary field][19]** | The first field in every table that serves as the main identifier for each row. | + +## Application Builder terms + +Terms for creating custom applications: + +| Term | Definition | +|------|------------| +| **[Application][21]** | A custom web interface built using the Application Builder, consisting of pages, elements, and data sources. Applications can be internal tools, customer portals, or public websites. | +| **Page** | An individual screen or route within an application. Applications can have multiple pages with navigation between them. | +| **Element** | A building block component added to pages (buttons, tables, forms, text, images, inputs, etc.). Elements are configured to display data and respond to user interactions. | +| **Data source** | A connection between application elements and database tables that provides data to display or modify. Data sources can include filters, sorting, and search parameters. | +| **Page parameter** | A variable passed in the URL that allows dynamic page content based on the parameter value (e.g., showing different customer details based on customer ID). | +| **Event** | An action that occurs when users interact with elements (clicking buttons, submitting forms, etc.). Events trigger workflows like navigation, data updates, or notifications. | +| **User source** | An authentication system that controls who can access an application and what data they can see based on their login credentials. | +| **Published application** | An application that has been deployed and is accessible to users via a URL or custom domain. | +| **Domain** | A custom web address (URL) assigned to a published application for professional branding. | +| **Theme** | Visual styling settings (colors, fonts, spacing) applied across an entire application for consistent appearance. | + +## Dashboard Builder terms + +Terms for visualizing data and metrics: + +| Term | Definition | +|------|------------| +| **[Dashboard][22]** | A visual analytics interface displaying data from databases through charts, tables, and metrics. Dashboards provide at-a-glance insights into key performance indicators. | +| **Widget** | An individual visualization component on a dashboard (chart, table, metric, gauge, etc.). Each widget displays specific data from connected database sources. | +| **Chart** | A visual representation of data using bars, lines, pies, or other graphical formats. Charts help identify trends, patterns, and comparisons. | +| **Data summary** | Calculations performed on database data to create summaries (sum, average, count, min, max, etc) displayed in dashboard widgets. | + +## Automation Builder terms + +Terms for creating automated workflows: + +| Term | Definition | +|------|------------| +| **[Automation][23]** | A container holding one or more workflows that run automatically based on triggers. Automations connect Baserow with other tools and automate repetitive tasks. | +| **Workflow** | A sequence of nodes (trigger + actions) that execute in order when the workflow runs. Each workflow has exactly one trigger followed by one or more actions. | +| **Node** | A single step in a workflow, either a trigger (the starting event) or an action (what happens next). Nodes execute sequentially from top to bottom. | +| **Trigger** | The first node in every workflow that determines when the workflow runs. | +| **Action** | A node that operates the trigger fires. Actions can create/update/delete rows, send notifications, call external APIs, or transform data. | +| **Test run** | A single manual execution of a workflow to verify it works correctly. Use for development and debugging. | +| **Publish** | Activating a workflow for production use. Published workflows run automatically whenever their trigger conditions are met, without manual intervention. | +| **History** | A log of all workflow executions showing successful runs, failures, error messages, and execution details. Essential for troubleshooting and monitoring automation performance. | +| **Conditional logic** | Rules that determine whether actions execute based on specific conditions (if/then statements). Allows workflows to make decisions based on data values. | +| **Data mapping** | Assigning values from trigger data to action fields, allowing information to flow through the workflow. | +| **Error handling** | How workflows respond when something goes wrong, including retry attempts, fallback actions, or notifications to admins. | + +## Deployment and administration terms + +Terms related to hosting and managing Baserow: + +| Term | Definition | +|------|------------| +| **[Baserow Cloud][24]** | The hosted SaaS version of Baserow at baserow.io where infrastructure, updates, and maintenance are managed by Baserow. Also called ""hosted"" or ""cloud"" version. | +| **[Self-hosted][24]** | Baserow installed on your own servers (on-premise or private cloud) where you manage infrastructure, updates, and maintenance. Also called ""on-premises"" hosting. | +| **[Instance][25]** | A complete Baserow installation, whether Cloud or Self-hosted. Each instance has a unique identifier used for licensing. | +| **[Instance ID][26]** | A unique identifier for your Baserow installation, required for premium license activation on Self-hosted deployments. | +| **[Instance admin][27]** | A server-wide administrator role (Self-hosted only) with access to all workspaces, user management, license activation, and system settings. The first user account is automatically an instance admin. Different from workspace admin. | +| **[Admin panel][28]** | The interface where instance admins manage users, workspaces, licenses, audit logs, and system settings. | +| **[License][25]** | A purchased subscription that activates paid features on Self-hosted installations. | +| **[License key][25]** | A unique string of characters used to register and activate a premium license on a Self-hosted instance. | +| **[Single Sign-On (SSO)][29]** | An authentication system allowing users to log in to Baserow using credentials from another service (Google, Microsoft, Okta, etc.) without creating separate passwords. | +| **Open source** | The freely available version of Baserow with core features, released under the MIT license. Can be used, modified, and distributed without licensing fees. | +| **Paid features** | Advanced functionality (advanced permissions, increased limits, premium field types) available through paid subscriptions on both Cloud and Self-hosted. | +| **Enterprise features** | High-end functionality (audit logs, SSO, admin panel, priority support) available on Enterprise plans. | + +## API and integration terms + +Terms for programmatic access and external connections: + +| Term | Definition | +|------|------------| +| **API (Application Programming Interface)** | A programmatic interface for accessing and manipulating Baserow data from external applications. Baserow provides a REST API for each database. | +| **Database token** | An authentication credential that grants API access to specific databases with defined permissions. Used instead of user passwords for secure API calls. | +| **Webhook** | An automated HTTP notification sent from Baserow to external services when specific events occur (row created, updated, deleted). Enables real-time integrations. | +| **REST API** | The architectural style of Baserow's API, using standard HTTP methods (GET, POST, PATCH, DELETE) to interact with data. | +| **Endpoint** | A specific URL in the API that performs a particular operation (e.g., `/api/database/tables/{table_id}/rows/` to access table rows). | +| **API Rate limit** | A restriction on how many API requests can be made within a time period. | + +### Collaboration terminology + +| Term | Definition | +| -------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| User | The broadest term. A person with a Baserow account. (Example: ""A user can be invited to multiple workspaces."") | +| Workspace Member | A user who has successfully joined a workspace. This is the standard term for anyone who is part of a workspace. (Example: ""Admins can manage all workspace members."") | +| Role (e.g., Admin, Editor) | The specific permission level assigned to a workspace member. (Example: ""A new workspace member is assigned the Editor role."") | +| Member role | A specific role that a workspace member can be assigned, which has fewer permissions than Admin. (Example: ""The Member role has fewer permissions than Admin."") | +| Collaborator | A term used for the Collaborator field type, which is used to assign a workspace member to a specific row. (Example: ""Assign a task using the Collaborator field."") | + +## Frequently asked questions + +### What's the difference between a workspace admin and instance admin? + +A **workspace admin** manages a specific workspace, adding members, creating databases, and controlling workspace-level permissions. An **instance admin** (Self-hosted only) manages the entire Baserow installation, all users, all workspaces, licenses, and system settings. One person can own both roles, but they serve different purposes. + +### How do views differ from applications? + +**Views** are different ways to display a single table's data within the Database Builder (Grid, Kanban, Calendar, etc.). **Applications** are standalone interfaces built with the Application Builder that can combine multiple tables, add custom layouts, and create experiences for users who never see the underlying database structure. + +### Do I need to understand all these terms before using Baserow? + +No. Start with core concepts (workspace, database, table, field, row) in the Database Builder. Learn Application Builder, Dashboard Builder, and Automation Builder terminology only when you're ready to use those modules. Most users begin with databases and gradually adopt other builders as their needs grow. + +### What's the difference between a trigger and an action in automations? + +A **trigger** is the starting event that causes a workflow to run (e.g., ""when a row is created""). Every workflow has one trigger. **Actions** are the operations that happen after the trigger fires (e.g., ""send an email"", ""update a row""). Workflows can have multiple actions that execute in sequence. + +### What does ""billable user"" mean for my subscription? + +Each billable user counts toward your plan's user limit. Guest access through public view sharing doesn't count toward your limit. Learn more about [billable users][4]. + +### Can I use automation without the Application Builder? + +Yes. Automations work independently and can interact with database tables directly. You don't need to build applications to use automation. Automations are useful for tasks like sending notifications, syncing data, generating reports, or connecting to external services, all without building custom apps. + +### What's the relationship between databases, applications, and dashboards? + +**Databases** store your structured data in tables. **Applications** present that data to users through custom interfaces. **Dashboards** visualize data through charts and metrics. All three can coexist in the same workspace, pulling from the same database tables. Think of databases as your data foundation, applications as user interfaces, and dashboards as analytics layers. + +## Related content + +- [Quick start guide: Get started with Baserow][31] +- [Introduction to Baserow][30] +- [Deploy Baserow: Choose your hosting option][24] +- [Introduction to databases][6] +- [Introduction to Application Builder][32] +- [Introduction to workspaces][2] +- [Keyboard shortcuts][33] + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](https://baserow.io/contact) for questions about Baserow or help with your account + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/f9c3368a-bcb1-405e-90cd-bfd1397573e8/Baserow%20basic%20concepts%20(1).jpg + [2]: /user-docs/intro-to-workspaces + [3]: /user-docs/managing-workspace-collaborators + [4]: /user-docs/subscriptions-overview#who-is-considered-a-user-for-billing-purposes + [5]: /user-docs/permissions-overview + [6]: /user-docs/intro-to-databases + [7]: /user-docs/intro-to-tables + [8]: /user-docs/database-and-table-id + [9]: /user-docs/baserow-field-overview + [10]: /user-docs/overview-of-rows + [11]: /user-docs/link-to-table-field + [12]: /user-docs/overview-of-baserow-views + [13]: https://baserow.io/user-docs/guide-to-grid-view + [14]: https://baserow.io/user-docs/guide-to-gallery-view + [15]: https://baserow.io/user-docs/guide-to-kanban-view + [16]: https://baserow.io/user-docs/guide-to-calendar-view + [17]: https://baserow.io/user-docs/guide-to-creating-forms-in-baserow + [18]: https://baserow.io/user-docs/guide-to-timeline-view + [19]: https://baserow.io/user-docs/primary-field + [20]: /user-docs/snapshots + [21]: https://baserow.io/user-docs/application-builder-overview + [22]: https://baserow.io/user-docs/dashboards-overview + [23]: https://baserow.io/user-docs/workflow-automation + [24]: /user-docs/set-up-baserow + [25]: /user-docs/get-a-licence-key + [26]: https://baserow.io/user-docs/getting-and-changing-the-instance-id + [27]: /user-docs/admin-panel-users + [28]: /user-docs/enterprise-admin-panel + [29]: /user-docs/single-sign-on-sso-overview + [30]: /user-docs/baserow-basics + [31]: /user-docs/how-to-get-started-with-baserow + [32]: /user-docs/application-builder-overview + [33]: /user-docs/baserow-keyboard-shortcuts",,baserow_user_docs,https://baserow.io/user-docs/learn-baserow-basic-concepts +5,Set up a workspace,setting-up-a-workspace,Baserow workspace setup guide for users,"# Set up a workspace in Baserow + +Create workspaces to organize your databases, applications, and team collaboration. Learn how to create, name, configure, and manage workspaces effectively. + +## Overview + +Workspaces are the foundation of your Baserow organization, every database, application, dashboard, and automation lives inside a workspace. + +Creating a workspace is the first step toward building your data infrastructure. This guide walks through workspace creation, configuration, and management to help you establish effective organizational structures. + +![Set up a workspace in Baserow][1] + +## Plan your workspace structure + +A workspace is an organized, collaborative environments for your team. Before creating a workspace, consider: + +**What will this workspace contain?** +- Related databases that need to link together +- Applications built from those databases +- Dashboards monitoring the data +- Automations connecting everything + +**Who needs access?** +- Team members who will collaborate +- Their required permission levels (admin, builder, editor, viewer) +- External stakeholders or clients + +**How will it fit with other workspaces?** +- Separate by department, project, or client +- Keep related work together +- Use clear naming conventions for easy identification. Choose workspace names that are descriptive and clearly indicate the workspace purpose, consistent, and specific. Good examples: ""Marketing - Campaign Management"", ""Sales Operations 2025"", ""Client: Acme Corp"", ""Product Development"". Avoid: ""Workspace 1"", ""Test"", ""My Stuff"", and overly long names that get truncated. + +[Learn more about workspace organization strategies →](/user-docs/intro-to-workspaces) + +## Create a workspace + +Creating a workspace automatically makes you the workspace admin with full control. When you create a new workspace, you become the workspace admin with full permissions and can invite collaborators. + + 1. Navigate to your Baserow home page + 2. Click on your workspace in the top-left corner and click **Add new workspace**. + 3. Enter a descriptive name for your workspace + 4. Click **Enter** or click outside the name field to save + +The workspace is empty and ready for databases, applications, and more. You can start building by adding databases or templates + +![Create new Baserow workspace][2] + +## Configure workspace + +To access workspace configuration options, navigate to the home page, click the workspace dropdown menu. + +From the workspace menu options, you can: + - Rename the workspace + - Export or [import][3] data + - Invite, manage members, and adjust [workspace permissions][4] + - Configure settings + - [Delete][5] the workspace if needed + - [View trash][6] + - [Leave][7] the workspace + +> Only [workspace admins][8] can fully configure workspaces. Members with other roles can export data or leave a workspace. + +### Rename a workspace + +Workspace names can be changed at any time by workspace admins. Use consistent naming across workspaces. If your organization has multiple workspaces, establish and follow naming conventions for easy identification and navigation. + +To rename a workspace: + +1. In the home page, click the workspace dropdown menu +2. Select **Rename workspace** from the menu +3. Enter the new name +4. Press **Enter** to save + +Renaming a workspace doesn't affect any databases, applications, member access, permissions, API connections, integrations, or shared views. + +### Manage workspace access + +After creating a workspace, you'll likely want to add team members. Invited members receive email notifications with instructions to join your workspace. [Complete guide to inviting collaborators →][8] + +Next, set permissions and roles. Assign roles based on what each team member needs to do. [Understanding workspace permissions →](/user-docs/manage-workspace-permissions) + +Review workspace members periodically, especially after project completions, team member role changes, or external collaborator engagements end. + +## Add content to your workspace + +Once your workspace is created, start building: + + - **[Add a database](/user-docs/intro-to-databases)**: Click **+ Create new** → Select **Database** → Choose to start from scratch or use a template → Begin adding tables and fields. + - **[Build an application](/user-docs/application-builder-overview)**: Click **+ Create new** → Select **Application** → Design pages and add elements → Connect to your database data. + - **[Create a dashboard][9]**: Click **+ Create new** → Select **Dashboard** → Add widgets and connect data sources → Monitor your key metrics + - **[Set up automations][10]**: Click **+ Create new** → Select **Automation** → Configure triggers and actions → Automate workflows + +## Frequently asked questions + +### Can I create workspaces without being invited by someone? + +On **Baserow Cloud**, anyone with an account can create workspaces by default. On **Self-hosted** instances, the Instance Admin controls whether new users can create workspaces. If you can't create a workspace, contact your Instance Admin. + +### How many workspaces can I create? + +There's no limit on workspace creation. + +### What's the difference between Workspace Admin and Instance Admin? + +A **workspace admin** manages a specific workspace (members, databases, settings). An **Instance Admin** (Self-hosted only) manages the entire Baserow installation (all users, all workspaces, system settings). One person can have both roles. + +### Can I transfer a workspace to someone else? + +You can make someone else a workspace admin, but workspaces don't have a single ""owner."" Best practice is to ensure every workspace has at least two admins to prevent access issues if one admin leaves. + +### What happens if I delete a workspace? + +Deleting a workspace removes all its contents (databases, applications, dashboards, automations). Export any important data before deletion. [Restore deleted items][6] from the past 3 days. + +### Can I move databases between workspaces? + +Not directly. You must export the database from one workspace and import it into another. This creates a copy; the original remains until you delete it. + +### Do I need to create a workspace before creating databases? + +Yes. Every database must belong to a workspace. If you're a new user, create a workspace first, then add databases to it. + +### Can workspace names be duplicated? + +Yes. You can have multiple workspaces with the same name (not recommended). Use unique, descriptive names to avoid confusion. + +## Troubleshooting + +### I can't create a workspace on Self-hosted + +The Instance Admin may have disabled workspace creation for new users. Contact your Instance Admin to either enable workspace creation for all users, invite you as a collaborator to an existing workspace, or create a workspace on your behalf. + +### My workspace name is truncated in the sidebar + +Very long workspace names get abbreviated in the interface. Rename the workspace with a shorter, clearer name. Aim for 30 characters or less for full visibility. + +### I can't see the workspace configuration option + +Only workspace admins can access all configuration options. If you need to modify workspace settings, ask a workspace admin to either grant you admin permissions or make the changes for you. + +### New members can't see databases I created + +Table-level or database-level permissions may be restricting access. Check permissions at the database and table level, or verify the member's workspace role is appropriate. + +## Related content + +### Getting started +- [Introduction to workspaces](/user-docs/intro-to-workspaces) +- [Quick start: Your path to Baserow mastery](/user-docs/how-to-get-started-with-baserow) +- [Baserow glossary](/user-docs/learn-baserow-basic-concepts) + +### Managing workspaces +- [Invite collaborators to a workspace][8] +- [Manage workspace permissions](/user-docs/manage-workspace-permissions) +- [Leave a workspace](/user-docs/leave-a-workspace) +- [Delete a workspace](/user-docs/delete-a-workspace) + +### Building in workspaces +- [Create a database](/user-docs/create-a-database) +- [Introduction to Application Builder](/user-docs/application-builder-overview) +- [Working with collaborators](/user-docs/managing-workspace-collaborators) + +### Administration +- [Understanding role hierarchy](/user-docs/role-based-access-control-rbac) +- [Create and manage teams](/user-docs/create-and-manage-teams) +- [Enterprise admin panel](/user-docs/enterprise-admin-panel) + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/980c8551-59c7-448d-844a-d259c2bbd250/Baserow%20workspace.jpg + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/3eba5569-9702-456c-b66b-455c55056ff2/Create%20new%20Baserow%20workspace.jpg + [3]: https://baserow.io/user-docs/import-workspaces + [4]: https://baserow.io/user-docs/permissions-overview + [5]: https://baserow.io/user-docs/delete-a-workspace + [6]: https://baserow.io/user-docs/data-recovery-and-deletion + [7]: https://baserow.io/user-docs/leave-a-workspace + [8]: /user-docs/working-with-collaborators + [9]: https://baserow.io/user-docs/dashboards-overview + [10]: https://baserow.io/user-docs/workflow-automation",,baserow_user_docs,https://baserow.io/user-docs/setting-up-a-workspace +6,Invite users to workspace,working-with-collaborators,Add users to your Baserow workspace,"# Invite users to a workspace + +Workspace admins can invite users via email to collaborate on databases and tables within the workspace. + +This guide covers how to invite users to your Baserow workspace, assign permissions, and help new users accept invitations and join your team. + +## Who can invite users + +Only workspace admins can invite new users to workspaces. If you're not a workspace admin, you'll need to ask an existing admin to either invite the user or upgrade your role to admin first. + +> **Plan-specific roles:** Free plans have [simplified roles](/user-docs/permissions-overview). Paid plans offer granular roles for [advanced permission management][1]. + +## Invite a user to a workspace + +Workspace admins send email invitations to add new users. Before you invite users, consider the impact on your [subscription plan][2]. + +1. Navigate to the **workspace** you want to add users to +2. Click **Members** tab in the side bar +4. Click **Invite Member** in the top-right corner +5. Enter the user's email address +6. Select the role (permission level) for this user: +7. Optionally add a custom message with context or instructions +8. Click **Send Invite** + +![Inviting a member to workspace][3] + +You cannot send invitations to users already in the workspace. Remove them first if you need to change their email or re-invite them. + +The invited user receives an email invitation with an ""Accept invitation"" button and link. Depending on whether they have an existing Baserow account, they'll follow different flows to join. + +## Accept invitation (new users) + +If you don't have a Baserow account, creating one from an invitation is straightforward. + +### Create account from invitation email + +1. Check your **email inbox** for the Baserow invitation +2. Click **Accept invitation** in the email +3. Baserow pre-fills the **invited email address** +4. Create a **password** for your account +5. Complete account creation +6. **Verify your email** by clicking the link in the confirmation email +7. Log in and access the workspace + +**Email not received?** Check your spam folder. If it's not there, ask the workspace admin to resend the invitation or contact support. + +**Different email preferred?** The system auto-fills the invited email. To use a different address, ask the workspace admin to send a new invitation to your preferred email. + +## Accept invitation (existing users) + +If you already have a Baserow account, accepting workspace invitations is simple. + +### Accept from dashboard + +1. **Log in** to your existing Baserow account +2. You'll see a **notification** on your dashboard about the workspace invitation +3. Click **Accept** to join the workspace immediately +4. Or click **Reject** if you don't want to join + +![Dashboard invitation notification][4] + +You can also accept the invitation via email if you prefer. Both methods work identically. + +### Access the workspace + +Once you accept, the workspace appears in your account immediately. You can access all databases and tables according to your assigned role. + +## Manage pending invitations + +Workspace admins can view and cancel pending invitations that haven't been accepted yet. + +### View pending invites + + 1. Navigate to **Workspace** -> **Members** -> Invites + 2. Pending invitations show with the email address, the default role assigned, and the message sent on the invite. + +### Cancel invitations + +If you invited someone by mistake or they no longer need access, cancel the invitation before they accept: + +1. Navigate to **Workspace** -> **Members** -> Invites +2. Click the **three-dot menu (⋮)** next to the invitation +3. Select **Cancel invite** + +Canceled invitations can't be accepted. Send a new invitation if needed. + +## Workspace member visibility + +All workspace members with the [right permissions][5] for the related workspace can see the complete workspace member list. + +Use the workspace member list to identify who to @mention in [comments](/user-docs/row-commenting) or assign using the [collaborator field](/user-docs/collaborator-field). + +> **Permission planning:** Decide which [role](/user-docs/permissions-overview) new users need before inviting. You can change roles later, but starting with the right permission level prevents access issues. + +Learn more: [Permissions overview](/user-docs/permissions-overview) + + +## Frequently asked questions + +### Can non-admin workspace members invite users to workspaces? + +No. Only workspace admins can invite new users. If you need to add someone, ask a workspace admin to send the invitation or request an admin role upgrade if you'll be inviting users regularly. + +### What happens if someone accepts an invitation to a workspace they're already in? + +They can't. Baserow prevents sending invitations to existing workspace members. If someone needs a different role, workspace admins can change their permissions directly in workspace member settings. + +### Can I invite multiple users at once? + +Not currently. Invite users one at a time through the invitation process. For large teams, consider inviting admins first, who can then help invite additional users. + +### Do invited users automatically get access to all databases? + +Yes, depending on their role assigned to the invite. Workspace members have access to databases within the workspace according to their role. Users on a paid plan can restrict access to specific databases or tables using [granular permissions](/user-docs/role-based-access-control-rbac). + +### How long does an invitation remain valid? + +Invitations don't expire automatically. They remain valid until accepted or canceled by a workspace admin. However, if a user doesn't accept for an extended period, consider canceling and resending to ensure they receive a fresh email. + +### Can I change someone's role after they join? + +Yes. Workspace admins can [change workspace member roles](/user-docs/manage-workspace-permissions) anytime. Role changes take effect immediately. + +### What if an invited user can't find the invitation email? + +First, check spam/junk folders. If not found, workspace admins should cancel the original invitation and send a new one. Ensure the email address is spelt correctly when sending invitations. + +Learn more: [Pricing plans](/user-docs/pricing-plans) + +## Related resources + +### Workspace member management +- [Manage workspace members](/user-docs/manage-workspace-permissions) - Change roles, remove members +- [Remove a workspace member](/user-docs/remove-a-user-from-a-workspace) - Revoke access +- [Assign roles to workspace members](/user-docs/assign-roles-to-members-at-workspace-level) - Permission configuration + +### Permissions +- [Permissions overview](/user-docs/permissions-overview) - Role-based access control +- [Assign database-level roles](/user-docs/assign-roles-at-database-level) - Granular permissions (Advanced/Enterprise) +- [Create and manage teams](/user-docs/create-and-manage-teams) - Group-based permissions (Advanced/Enterprise) + +### Collaboration +- [Collaboration overview](/user-docs/managing-workspace-collaborators) - Team collaboration guide +- [Row comments](/user-docs/row-commenting) - Communicate with @mentions +- [Collaborator field](/user-docs/collaborator-field) - Assign tasks to **workspace members** +- [Public sharing](/user-docs/public-sharing) - Share without workspace access + +--- + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow.io/user-docs/set-permission-level + [2]: https://baserow.io/user-docs/subscriptions-overview + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/86a76bff-c8e3-4c72-95a2-ed5609fecf5d/Inviting%20a%20member%20to%20workspace.jpg + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/42d96a76-1688-4b75-81dd-5defcc454e8d/Dashboard%20invitation%20notification.jpg + [5]: https://baserow.io/user-docs/permissions-overview",,baserow_user_docs,https://baserow.io/user-docs/working-with-collaborators +7,Leave a workspace,leave-a-workspace,Leave a workspace in Baserow,"# Leave a Baserow workspace + +Learn how to leave a workspace you no longer need access to, understand what happens to your data, and explore your options if you're the last admin. + +Baserow makes it easy to leave workspaces while ensuring no workspace is left without an admin to maintain it. + +## Overview + +Leaving a workspace removes your access to all databases and applications within that workspace, but the workspace itself remains active for other users. This is useful when you need to exit a project or team but want others to continue working. + +If you're the last admin, you'll need to assign another admin before leaving, or consider deleting the workspace entirely. + +![Importing a workspace in Baserow][1] + +## What happens when you leave a workspace + +When you leave a workspace: +- You immediately lose access to all databases, automations, dashboards, tables, and applications in that workspace +- Other users retain full access and can continue working +- The workspace remains active and unchanged +- You can only regain access if a workspace admin re-invites you + +> Leaving a workspace does not delete it. To remove a workspace entirely, see [Delete a workspace](/user-docs/delete-a-workspace). + + + +## How to leave a workspace + +1. Navigate to the workspace you want to leave +2. Click on your workspace name in the home page +3. Select **Leave workspace** from the menu +4. Confirm your decision in the dialog box + + + +## Leaving as the last admin + +If you're the only admin in a workspace, Baserow prevents you from leaving to ensure the workspace isn't left unmaintained. You have two options: + +### Option 1: Assign a new admin before leaving + +1. Go to the workspace **Members** settings page +2. Find another user you trust +3. Change their role to **Admin** +4. Once they're promoted, you can leave the workspace + +### Option 2: Delete the workspace + +If no one else should have access after you leave, consider deleting the workspace instead: +1. Go to workspace settings +2. Select **Delete workspace** +3. Confirm the deletion + +> Deleting a workspace removes all data for all users. + + + +## Leave vs. delete: Which should you choose? + +| Scenario | Recommended action | +|----------|-------------------| +| Other users should continue working | Leave workspace (after assigning new admin) | +| You want to remove your access only | Leave workspace | +| No one should access the workspace after you | Delete workspace | +| Workspace contains sensitive data you own | Delete workspace | +| You're collaborating on a temporary project | Leave workspace | + + + +## Frequently asked questions + +### Can I rejoin a workspace after leaving? + +Yes, but only if a workspace admin re-invites you. You cannot rejoin on your own. Contact a current admin and ask them to send you a new invitation. + +### What happens to my data when I leave? + +All data you create remains in the workspace. Other users can still view and edit tables, rows, and databases you contributed to. If you want to preserve personal copies, export your data before leaving. + +### Why can't I leave if I'm the last admin? + +Baserow requires every workspace to have at least one admin to manage members and settings. This prevents workspaces from becoming orphaned. Promote another user to admin first, or delete the workspace if no one else needs access. + +### How do I know if I'm the last admin? + +Go to the workspace **Members** page and check the role column. If you're the only user with an ""Admin"" role, you're the last admin and must assign another before leaving. + + + +## Related content + +- **[Remove a user from a workspace](/user-docs/remove-a-user-from-a-workspace)** – Learn how admins can remove collaborators from workspaces +- **[Set up a workspace](/user-docs/setting-up-a-workspace)** – Create and configure new workspaces for your team +- **[Delete a workspace](/user-docs/delete-a-workspace)** – Permanently remove a workspace and all its data +- **[Manage workspace members](/user-docs/manage-workspace-permissions)** – Control roles and permissions for users + +--- + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account. + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/4b695b1f-f545-4927-be45-f3d32af39776/export_and_import_of_workspaces.webp",,baserow_user_docs,https://baserow.io/user-docs/leave-a-workspace +8,Delete a workspace,delete-a-workspace,Delete a Baserow workspace,"# Delete a workspace in Baserow + +Baserow makes workspace deletion straightforward but includes safety measures to prevent accidental data loss. + +Learn how to delete a Baserow workspace, understand the retention period for recovery, and decide whether deletion or leaving is the right choice for your situation. + +Admin permission is required. Only workspace admins can delete workspaces. If you're not an admin, you can [leave a workspace](/user-docs/leave-a-workspace) instead. + + + +## Overview + +Deleting a workspace removes it along with all databases, tables, applications, and data it contains. While Baserow provides a retention period to recover deleted workspaces from the trash, deletion becomes irreversible after this window closes. + +This action affects all users in the workspace, so consider alternatives like leaving the workspace or transferring admin ownership if you simply need to step away. + +![Workspace deletion menu location](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/4b695b1f-f545-4927-be45-f3d32af39776/export_and_import_of_workspaces.webp) + +## How to delete a workspace + +### Step-by-step instructions + +1. **Navigate to the workspace** you want to delete +2. Click on your workspace name on the home page +3. **Select ""Delete workspace""** from the dropdown menu +4. **Confirm deletion** in the dialog box + +Double-check that you're deleting the correct workspace. This action removes the workspace for all users, not just you. Everyone loses access to the workspace and its contents. + +### What gets deleted + +When you delete a workspace, Baserow removes all databases and tables within the workspace, all applications built with Application Builder, all dashboards, all automations, workspace settings and member permissions, and integration connections and API tokens. + +### Retention period and recovery + +After deletion, workspaces move to the trash, where they can be recovered. All data is restored exactly as it was at the time of deletion, including all user permissions. + +Deleted workspaces remain in the trash for a limited time. Visit [Trash](/user-docs/data-recovery-and-deletion) to restore. After the retention period expires, data is permanently erased and cannot be recovered. + +## Delete vs. leave: Which should you choose? + +| Your situation | Recommended action | Why | +|----------------|-------------------|-----| +| You want to stop using Baserow entirely | Delete workspace | Removes all data | +| Other users should keep working | Leave workspace | Workspace stays active for others | +| You're stepping down as admin | Leave (after assigning new admin) | Ensures continuity for the team | +| Workspace contains outdated/test data | Delete workspace | Frees up storage and reduces clutter | +| You might need the data later | Export first, then delete | Preserves data outside Baserow | +| Workspace has sensitive data to remove | Delete workspace | Ensures complete data removal after retention period | + + + +## Before you delete: Important considerations + +### Backup your data +If you might need workspace data in the future: +1. Export workspace before deletion +2. Download important files from the file fields +3. Document important formulas or configurations + +### Notify collaborators +- Inform all workspace members before deleting +- Give them time to export personal data +- Share alternative workspaces if transitioning projects + +### Check for dependencies +- Review if other systems integrate with this workspace's API +- Confirm no active webhooks depend on this workspace +- Verify no external applications use this workspace's data sources + +## Alternatives to deletion + + - [Leave the workspace](/user-docs/leave-a-workspace) to remove only your access. If you no longer need access, but others should continue working. The workspace remains active for other users. An admin can re-invite you if needed later. + - [Promote another user to admin](/user-docs/manage-workspace-permissions). If you're the sole admin but want the workspace to continue, then leave the workspace yourself. The new admin takes over management responsibilities. + - Archive for future reference: If you might need the data later, but want to free up active usage, [export the entire workspace](/user-docs/export-workspaces). Delete the workspace to free resources. Re-import if needed in the future + + +## Frequently asked questions + +### What happens to other users when I delete a workspace? + +All users immediately lose access to the workspace and receive a notification. They won't be able to access any databases, tables, or applications that were in the deleted workspace. If they need continued access, consider leaving the workspace instead of deleting it. + +### Can I delete a workspace I don't own? + +Only workspace admins can delete workspaces. If you're a member or editor, you cannot delete the workspace. However, you can [leave the workspace](/user-docs/leave-a-workspace) to remove your own access, or ask an admin to delete it. + +### Will deleted workspaces affect my subscription? + +If you're on a paid plan, you can't delete the workspace. The workspace active subscription must be canceled before deleting the workspace. + +### How do I know if I'm a workspace admin? + +Go to the workspace **Members** page in settings. If your role shows ""Admin,"" you have permission to delete the workspace. If you see ""Member"" or ""Editor,"" you'll need to ask an admin to delete it or grant you admin permissions first. + + + + + +## Related content + +- **[Leave a workspace](/user-docs/leave-a-workspace)** – Remove your own access while keeping the workspace active for others +- **[Recover deleted data from trash](/user-docs/data-recovery-and-deletion)** – Restore workspaces, databases, and tables within the retention period +- **[Export workspaces](/user-docs/export-workspaces)** – Create backups before deleting +- **[Manage workspace members](/user-docs/manage-workspace-permissions)** – Control who has admin permissions to delete workspaces +- **[Set up a workspace](/user-docs/setting-up-a-workspace)** – Create new workspaces after deletion + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](https://baserow.io/contact) for questions about Baserow or help with your account.",,baserow_user_docs,https://baserow.io/user-docs/delete-a-workspace +9,Create a database,create-a-database,Create a Baserow database,"# Create a database in Baserow + + +Baserow makes database creation accessible to everyone, regardless of technical expertise, no coding required. + +Learn ways to create databases in Baserow, from scratch, from templates, by duplicating existing databases, or by importing from Airtable. Choose the method that best fits your project needs. + + + +## Overview + +Creating a database in Baserow is straightforward and flexible. Whether you're starting fresh, using a pre-built template, copying an existing structure, or migrating from another platform, Baserow provides multiple pathways to get your project running quickly. + +Each method suits different scenarios: start from scratch for complete customization, use templates for quick setup, duplicate for consistency, or import to preserve existing work. + + + + +## Before you begin + +### Prerequisites +- You must have [a workspace](/user-docs/setting-up-a-workspace) to create databases +- You need at least **Member** permissions in the workspace +- Consider what type of data you'll be organizing before starting + +### Planning your database +Ask yourself: +- What information am I tracking? (customers, projects, inventory, etc.) +- How many tables will I need? +- Will tables need to be connected? +- Am I migrating existing data or starting fresh? + + + +## How to create a database + +| Method | Best for | +|--------|----------| +| **From scratch** | Custom projects with unique requirements | +| **From template** | Common use cases (CRM, project management) | +| **Duplicate existing** | Replicating structure for new projects | +| **Import from Airtable** | Migrating from Airtable with existing data | + + + +### Method 1: Create a database from scratch + +Starting from scratch gives you complete control over your database structure. This method is ideal when you have specific requirements that don't match existing templates. + +**Step-by-step instructions** + +1. Navigate to your workspace in the sidebar +2. Click the **+ Add new""** button +3. Select ** Database** from the dropdown menu +4. Enter a descriptive name for your database (e.g., ""Customer Management,"" ""Q1 Inventory"") +5. Click **Create** to generate your database + +**After creation: Build your structure** + +Once your database is created, it opens with one default table. You can then add more tables as needed to organize different types of data. Define fields by choosing the right [field type](/user-docs/baserow-field-overview) such as text, number, or date, and configure field properties and validation rules. For guidance, see [Create a field](/user-docs/adding-a-field). + +Populate your tables by entering data manually, [importing from CSV or Excel](/user-docs/create-a-table-via-import), collecting data through [forms](/user-docs/guide-to-creating-forms-in-baserow), or connecting via the [API](/user-docs/database-api) for automated input. + +To structure relationships between data, use [Link to table](/user-docs/link-to-table-field) fields to connect related tables, [lookup fields](/user-docs/lookup-field) to display linked data, and [rollup fields](/user-docs/rollup-field) to calculate values across those relationships. + +### Method 2: Create a database from a template + +Templates provide pre-built database structures for common use cases, saving you setup time and providing best-practice organization. + +After importing, the template will be fully functional with sample data. Customize the database name, fields, views, and structure to match your specific needs. + +Learn more about how to [add database from template](/user-docs/add-database-from-template) + +![Rename Baserow database image][1] + +### Method 3: Duplicate an existing database + +Duplicating a database creates an exact copy of its structure and data. + +This method is useful for setting up separate databases for different teams or departments, starting new projects based on existing ones, creating testing environments without affecting live data, or archiving databases at specific points in time. + +**How to duplicate a database** + + 1. Locate the database you want to duplicate in the workspace home page + 2. **Click the three dots `⋮` icon** next to the database name to reveal the actions menu + 3. Select **Duplicate database** from the dropdown menu + +When a database is duplicated, all tables and their data are copied, including field configurations, field types, and views such as Grid, Gallery, Kanban, etc. Filters, sorts, groupings, formulas, field dependencies, and any file uploads or attachments are also duplicated. + +> Large databases may take several minutes to duplicate. You can continue working while duplication happens in the background. + + + +### Method 4: Import from Airtable + +Migrating from Airtable? Baserow makes it easy to preserve your existing work while gaining access to open-source flexibility. + +Learn more about how to [import Airtable to Baserow](/user-docs/import-airtable-to-baserow) + + +## Frequently asked questions + +### Can I create unlimited databases in a workspace? + +Yes, there's no hard limit on the number of databases per workspace in Baserow. However, keeping related tables in the same database makes relationship management easier. Consider creating separate databases only when projects are truly independent or when you need different permission levels. + +### What happens if I delete a database by accident? + +Deleted databases move to the trash where they can be recovered within the retention period. After the retention period, deletion is permanent. Learn more: [Delete and recover data](/user-docs/data-recovery-and-deletion). + +### Can I convert a table into a separate database? + +Not directly. To move a table to its own database, export the table as CSV, create a new database, then import the CSV as a new table. Note that this breaks any relationships with other tables in the original database. + +### How do I know which creation method to use? + +Use this decision tree: +- **Have similar structure to existing database?** → Duplicate +- **Migrating from Airtable with data?** → Import +- **Common use case (CRM, project management)?** → Template +- **Unique requirements or learning Baserow?** → From scratch + +### Can I merge multiple databases together? + +Baserow doesn't offer automatic database merging. To combine databases manually: +1. Export tables from one database as CSV files +2. Import those CSV files as new tables in the target database +3. Manually recreate relationships using Link to table fields +4. Test thoroughly before deleting the source database + +## Related content + +Now that you've created your database, explore these topics to maximize its potential: + +### Build your database structure +- **[Introduction to tables](/user-docs/intro-to-tables)** – Understand how tables organize your data +- **[Create a table](/user-docs/create-a-table)** – Add tables to your database +- **[Introduction to fields](/user-docs/baserow-field-overview)** – Learn about 25+ field types available + +### Work with data +- **[Create a row](/user-docs/how-to-make-new-rows)** – Add individual records to tables +- **[Import data into tables](/user-docs/import-data-into-an-existing-table)** – Bulk upload from spreadsheets +- **[Create custom views](/user-docs/create-custom-views-of-your-data)** – Visualize data in different ways + +### Advanced features +- **[Link to table field](/user-docs/link-to-table-field)** – Create relationships between tables +- **[Introduction to formulas](/user-docs/formula-field-overview)** – Automate calculations and data manipulation +- **[Webhooks](/user-docs/webhooks)** – Trigger actions when data changes + +### Collaboration and sharing +- **[Add workspace collaborators](/user-docs/working-with-collaborators)** – Invite team members +- **[Role-based permissions](/user-docs/permissions-overview)** – Control who can edit what +- **[Share a view publicly](/user-docs/public-sharing)** – Create public links to data + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](https://baserow.io/contact) for questions about Baserow or help with your account. + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/c6771efd-a839-493b-b24c-ff2fb269f8e8/Rename%20Baserow%20database.jpg",,baserow_user_docs,https://baserow.io/user-docs/create-a-database +10,Delete a database,delete-a-database,Delete a database in a Baserow workspace,"# Delete a database in Baserow + +Baserow makes database deletion straightforward while protecting you from accidental data loss with built-in recovery options. + +Remove databases you no longer need. Understand the 5-second undo window, the grace period for trash recovery, and what happens to your data and collaborators. + + + +## Overview + +Deleting a database removes it from your workspace and makes it inaccessible to all collaborators. + +Baserow provides two safety nets: a 5-second undo window immediately after deletion, and the grace period for trash recovery. After the grace period, deletion becomes permanent and irreversible. + +![Rename Baserow database image][1] + + + +## How to delete a database + +1. Locate the database in your workspace home page +2. Click the **`⋮` icon** next to the database name +3. Select **Delete** from the dropdown menu +4. Confirm deletion in the dialog box + + +## What happens when you delete a database + +**Immediate effects:** +- Database disappears from your workspace sidebar +- All collaborators lose access instantly +- Database moves to trash for the grace period for trash recovery +- 5-second undo window available immediately after deletion + +**During grace period :** +- Database remains recoverable from trash +- Data is preserved but inaccessible +- Other workspace members can restore if they have permissions +- Storage space remains allocated + +**After the grace period:** +- Database is permanently deleted +- All tables, rows, and uploaded files are removed +- Data becomes unrecoverable through any means +- Storage space is freed + +## Recovery options + +### Option 1: Immediate undo (within 5 seconds) + +Right after clicking delete, a notification appears at the bottom-right corner with a **Restore deleted application** button. Click it immediately to restore the database without any interruption. This is the fastest recovery method and prevents the database from entering trash. + +Learn more: [Undo and redo actions](/user-docs/data-recovery-and-deletion) + +### Option 2: Restore from trash + +If you miss the 5-second undo window, recover deleted databases from the trash. + +The grace period starts the moment you delete the database. After the grace period for trash recovery, restoration becomes impossible. + +Learn more: [Restore data from trash](/user-docs/data-recovery-and-deletion) + + +## Before you delete: Consider alternatives + +| Your situation | Better option | Why | +|----------------|--------------|-----| +| You want to remove your own access | [Leave workspace](/user-docs/leave-a-workspace) | Keeps database active for others | +| You need a backup before cleanup | [Create snapshot](/user-docs/snapshots) | Preserves point-in-time copy | +| Testing changes without risk | [Duplicate database](/user-docs/create-a-database#duplicate-a-database) | Test on copy, keep original safe | +| Archiving old projects | [Export database](/user-docs/export-workspaces) then delete | Keeps offline backup | +| Database has valuable structure | Duplicate, then clear data | Reuse structure for new projects | + + + +## Frequently asked questions + +### What's the difference between undo and trash recovery? + +**Undo:** Instantly restores the database as if deletion never happened. No interruption to collaborators who may still have the database open. This is the fastest option, but only available immediately after deletion. + +**Trash recovery:** Restores the database from trash after the undo window closes. Available for the grace period for recovery after deletion. + +### Can other workspace members restore the databases I deleted? + +Yes, any workspace member with appropriate permissions can restore databases from trash within the grace period. Database deletion affects everyone, so recovery is also available to the team, not just the person who deleted it. + +### What happens to collaborators when I delete a database? + +All collaborators lose access immediately when a database is deleted. If they had the database open, they would see an error message and be redirected to the workspace. Restoring from trash reinstates access for everyone automatically. + +### Can I recover a database after the grace period? + +No. After the grace period expires, databases are permanently deleted and cannot be recovered through any means. This is why [creating regular snapshots](/user-docs/snapshots) or [exports](/user-docs/export-workspaces) is recommended for important databases. + + +## Related content + +- **[Restore data from trash](/user-docs/data-recovery-and-deletion)** – Recover deleted databases +- **[Create snapshots](/user-docs/snapshots)** – Make point-in-time backups before deletion +- **[Export databases](/user-docs/export-workspaces)** – Create offline backups +- **[Duplicate a database](/user-docs/create-a-database#duplicate-a-database)** – Test changes on copies instead of deleting +- **[Leave a workspace](/user-docs/leave-a-workspace)** – Remove your access without deleting + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account. + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/c6771efd-a839-493b-b24c-ff2fb269f8e8/Rename%20Baserow%20database.jpg",,baserow_user_docs,https://baserow.io/user-docs/delete-a-database +11,Create views,create-custom-views-of-your-data,Create custom views of your data,"# Create and duplicate views + +Views let you see your table data in different ways without changing the underlying information. Create as many views as you need for different workflows, team members, or use cases. + +This guide covers how to create and duplicate views in Baserow to visualize your table data in multiple formats. + +## What are custom views? + +Baserow views are personalized ways to display and filter your table data. Each view can have its own filters, sorts, field visibility, and display format. Changes you make to data in any view update all other views because they share the same underlying records. + +![Custom views in Baserow showing different view types][3] + + +## Understanding view types + +Before creating a view, consider which format best suits your needs. Every new table starts with a default grid view. You can add unlimited additional views in any format. + +Visit the [views overview](/user-docs/overview-of-baserow-views) to learn about all available view types, switch between them, and search for views. You may also find the guide on [sharing views](/user-docs/public-sharing) useful for collaboration. + +## How to create a new view + +1. Click the **view dropdown** next to your current view name at the top of the table (shows ""≡ Grid"" for new tables) +2. In the bottom section of the dropdown, select the **view type** you want to create +3. Choose the **view permission type**: + - [Collaborative](/user-docs/collaborative-views) - Shared with all workspace members + - [Personal](/user-docs/personal-views) - Private to you only +4. Enter a **unique name** for your view (recommended when you have multiple views) +5. Click **Create view** + +![Creating a new view in Baserow](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/a9007150b3c81d47840366908a5214573b01ebad.webp) + +After creating your view, you can [customize its settings](/user-docs/view-customization) including filters, sorts, field visibility, and column widths. + +## How to duplicate a view + +Duplicating a view copies its configuration including filters, sorts, field visibility, and formatting. This saves time when creating similar views. + + 1. Click the **view dropdown** at the top of the table + 2. Find the view you want to duplicate + 3. Click the **three-dot menu (⋮)** next to the view name + 4. Select **Duplicate view** from the options. + 5. Rename and customize the duplicated view as needed + +Duplicating is useful for: +- Creating variations with different filters +- Testing new configurations without losing the original +- Setting up similar views for different team members +- Maintaining backup copies of complex view setups + +![Duplicating a view in Baserow](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/b9b49a01-1c40-4945-958b-4ea9ebaacecd/Screenshot%202022-07-22%20at%2014.27.59.png) + +## Frequently asked questions + +### How many views can I create per table? + +There's no limit to the number of views you can create per table. Create as many as you need for different workflows, team members, or use cases. However, too many views can make navigation harder; consider using clear naming conventions. + +### Can I rename a view after creating it? + +Yes. Click the view dropdown, find your view, click the three-dot menu (⋮) next to it, and select ""Rename view."" You can update the name anytime without affecting the view's data or configuration. + +### What happens to my view if someone deletes the table? + +If a table is deleted, all its views are deleted too, since views only exist within their parent table. [Deleted tables](/user-docs/delete-a-table) can be recovered from the trash, which restores all views along with the table data. + +### Do duplicated views stay in sync with the original? + +No. When you duplicate a view, it creates an independent copy. Changes to one view's configuration (filters, sorts, etc.) don't affect the duplicate. However, data changes sync across all views because they share the same underlying records. + +### Can I convert a collaborative view to a personal view? + +Not directly. To make a personal version of a collaborative view, duplicate the collaborative view and create the duplicate as a personal view. You can then customize the personal version without affecting the shared collaborative view. + +## Next steps after creating views + +Once you've created your views, enhance them with these features: + +**[Customize view settings](/user-docs/view-customization):** +- Add filters to show only relevant records +- Sort data by field values +- Hide or show specific fields +- Adjust column widths and row heights +- Apply conditional coloring + +**[Share your views](/user-docs/public-sharing):** +- Generate public links for external sharing +- Control view permissions for team members +- Create read-only access for stakeholders +- Embed views in other applications + +**[Export view data](/user-docs/export-a-view):** +- Download filtered data as CSV +- Export to JSON or XML formats +- Share snapshots of current view state + +## Related content + +### View basics +- [Views overview](/user-docs/overview-of-baserow-views) - Understanding view concepts +- [Collaborative views](/user-docs/collaborative-views) - Shared team views +- [Personal views](/user-docs/personal-views) - Private individual views +- [View configuration options](/user-docs/view-customization) - Filters, sorts, and settings + +### View types +- [Grid view guide](/user-docs/guide-to-grid-view) - Spreadsheet interface +- [Gallery view guide](/user-docs/guide-to-gallery-view) - Visual card display +- [Form view guide](/user-docs/guide-to-creating-forms-in-baserow) - Data collection +- [Kanban view guide](/user-docs/guide-to-kanban-view) - Project boards +- [Calendar view guide](/user-docs/guide-to-calendar-view) - Event scheduling +- [Timeline view guide](/user-docs/guide-to-timeline-view) - Project planning + +### Advanced features +- [Share a view publicly](/user-docs/public-sharing) - External access and embedding +- [Export a view](/user-docs/export-a-view) - Download view data +- [Filter rows](/user-docs/filters-in-baserow) - Show specific records +- [Sort data](/user-docs/view-customization) - Order records by fields + +--- + + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/0b85a937-a728-4b7d-a887-167c31dfff9e/View%20permissions%20allow%20all%20members%20to%20create%20and%20modify%20views.jpg",,baserow_user_docs,https://baserow.io/user-docs/create-custom-views-of-your-data +12,Configure data views,view-customization,View configuration options in Baserow,"# View configuration options + +View configuration options let you customize how data appears and which operations are available. Each view type offers different configuration options based on its purpose. + +This guide covers where to find view configuration options in Baserow and how to customize views through the toolbar and view menu. + +![View configuration toolbar in Baserow][1] + +## Understanding view configuration + +View configuration happens in two places: the toolbar at the top of your view and the view menu (⋮) next to the view name. The toolbar provides quick access to data manipulation options, while the view menu contains view management operations. + +Changes you make to the view configuration are saved automatically and persist when you return to the view. [Collaborative views](/user-docs/collaborative-views) share configurations with all workspace members, while [personal views](/user-docs/personal-views) keep your settings private. + +## View toolbar options + +The toolbar at the top of each view provides quick access to data organization features. Available options vary by view type: + +| Feature | Grid | Gallery | Kanban | Calendar | Timeline | Form | +|---------|------|---------|--------|----------|----------|------| +| **Filter** | ✓ | ✓ | ✓ | ✓ | ✓ | – | +| **Sort** | ✓ | ✓ | – | – | ✓ | – | +| **Group** | ✓ | – | – | – | – | – | +| **Hide fields** | ✓ | – | – | – | – | – | +| **Row height** | ✓ | – | – | – | – | – | +| **Share view** | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| **Row colors** | ✓ | ✓ | ✓ | ✓ | – | – | +| **Customize cards** | – | ✓ | ✓ | – | – | – | +| **Stacked by** | – | – | ✓ | – | – | – | +| **Displayed by** | – | – | – | ✓ | – | – | +| **Labels** | – | – | – | ✓ | – | – | +| **Change mode** | – | – | – | – | – | ✓ | +| **Preview** | – | – | – | – | – | ✓ | + +### Data organization features + +These toolbar options control how data displays in your view: + +**[Filters](/user-docs/filters-in-baserow)** - Show only records matching specific conditions. Available in most view types for focusing on relevant data. + +**Sort** - Order records by field values in ascending or descending order. Changes display order without modifying data. + +**[Group](/user-docs/group-rows-in-baserow)** - Organize records into collapsible sections based on field values. Available in grid view only. + +**[Hide fields](/user-docs/field-customization)** - Control which columns appear in your view. Each view can show different fields. + +**[Row height](/user-docs/navigating-row-configurations)** - Adjust row size in grid view (short, medium, tall, extra tall) to show more or less content. + +**[Row colors](/user-docs/row-coloring)** - Apply conditional formatting to highlight records based on field values. + +### View-specific features + +**Customize cards** (Gallery, Kanban) - Choose which fields display on cards and how they're arranged. + +**Stacked by** (Kanban) - Select which single select field determines the kanban columns. + +**Displayed by** (Calendar) - Choose which date field determines when records appear on the calendar. + +**Labels** (Calendar) - Select which field values appear as event labels on the calendar. + +**[Change mode](/user-docs/form-survey-mode)** (Form) - Switch between standard form and survey mode. + +**Preview** (Form) - See how your form appears to respondents before sharing. + +### Sharing and collaboration + +**[Share view](/user-docs/public-sharing)** - Generate public links or embed codes to share views with people outside your workspace. Control whether viewers can edit, comment, or only view data. + +## View menu operations + +Click the three-dot menu (⋮) next to any view name to access view management operations: + +### Rename a view + +1. Click the **⋮** next to the view name +2. Select **Rename view** +3. Enter the new name +4. Press Enter or click outside to save + +![Renaming a view in Baserow](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/Screenshot_2022-06-13_at_13.56.57.png) + +Clear, descriptive names help team members identify views quickly. Use names like ""Active Projects - Marketing"" instead of ""View 2."" + +### Delete a view + +1. Click the **⋮** next to the view name +2. Select **Delete view** +3. Confirm the deletion + +![Deleting a view in Baserow](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/Screenshot_2022-06-13_at_13.53.32.png) + +**Important:** You cannot delete the last collaborative view in a table. Every table must have at least one [collaborative view](/user-docs/collaborative-views) accessible to all workspace members. + +### Duplicate a view + +Duplicating copies all view settings, including filters, sorts, field visibility, and formatting. Use this to create variations of existing views or test new configurations safely. + +Click the **⋮** next to the view name -> Select **Duplicate view** + +Learn more: [Create and duplicate views](/user-docs/create-custom-views-of-your-data) + +### Convert between collaborative and personal + +1. Click the **⋮** next to the view name +2. Select **Change to personal view** or **Change to collaborative view** +3. Confirm the conversion + +Converting a collaborative view to personal makes it visible only to you. Converting a personal view to a collaborative view shares it with all workspace members. + +Learn more: [Collaborative views](/user-docs/collaborative-views) | [Personal views](/user-docs/personal-views) + +### Export a view (Grid view only) + +1. Click the **⋮** next to the view name +2. Select **Export view** +3. Choose your format (CSV, JSON, or XML) +4. Configure export options +5. Click **Export** + +Only currently visible and filtered records are exported. Use filters before exporting to create custom data reports. + +Learn more: [Export a view](/user-docs/export-a-view) + +### Import file + +1. Click the **⋮** next to the view name +2. Select **Import file** +3. Choose your file (CSV, JSON, or XML) +4. Map fields or create new ones +5. Confirm the import + +Imported data adds new rows to the table and appears in all views according to their filter settings. + +Learn more: [Import data into tables](/user-docs/import-data-into-an-existing-table) + +### Configure webhooks + +1. Click the **⋮** next to the view name +2. Select **Webhooks** +3. Create or manage webhook configurations + +Webhooks notify external systems when records are created, updated, or deleted in your table. + +Learn more: [Webhooks](/user-docs/webhooks) + +### Configure date dependency + +Available when using [date][2] and [duration][3] fields with dependency enabled. Configure which date fields depend on others for automatic date calculations. + +Learn more: [Date dependency][4] + +## Organize views + +**Change view order** by dragging views in the view dropdown. The first view in the list becomes the default view that loads when opening the table. + +![Organizing views by dragging](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/a9f6dcb4afdde6e7bd7a2666a1af2cac32ab7a71.webp) + +In collaborative views, reordering affects all workspace members. The view order determines which view loads by default and helps organize views logically. + +## View memory + +**Baserow remembers your last used view** for each table. When you return to a table, it opens with the view you used most recently, making your workflow more efficient. + +![Last visited view memory in Baserow](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/0a2a6ceb-1ae1-445a-9988-e490ac500996/Last%20visited%20view.png) + +This automatic memory works across: +- Different tables in the same database +- Multiple browser tabs +- Sessions after closing and reopening Baserow + +## Frequently asked questions + +### Which configuration options affect other users? + +In [collaborative views](/user-docs/collaborative-views), all configuration changes affect everyone who accesses the view. In [personal views](/user-docs/personal-views), your configurations remain private. Data changes (adding, editing, deleting records) always sync across all views regardless of type. + +### Can I reset a view to default settings? + +Not directly, but you can remove individual configurations: clear all filters, remove sorts, show all hidden fields, and remove row colors. Alternatively, create a fresh view and delete the configured one. + +### Why can't I see certain toolbar options? + +Toolbar options vary by view type and your permissions. Some features like ""Hide fields"" only appear in grid view, while ""Customize cards"" appears only in gallery and kanban views. Check your [workspace role](/user-docs/permissions-overview) if options seem missing. + +### Do my view configurations slow down Baserow? + +No. View configurations don't impact performance significantly. Complex filters on very large tables (10,000+ rows) might take slightly longer to calculate, but this is typically imperceptible. + +### Can I copy view configurations to other tables? + +Not directly. You can duplicate views within the same table, but configurations don't transfer between tables. You'll need to manually recreate filters, sorts, and other settings in the new table's views. + +## Related content + +### View basics +- [Views overview](/user-docs/overview-of-baserow-views) - Understanding view concepts +- [Create custom views](/user-docs/create-custom-views-of-your-data) - Step-by-step view creation +- [Collaborative views](/user-docs/collaborative-views) - Shared team views +- [Personal views](/user-docs/personal-views) - Private individual views + +### Configuration features +- [Filters in Baserow](/user-docs/filters-in-baserow) - Filter records by conditions +- [Advanced filtering](/user-docs/advanced-filtering) - Complex filter logic +- [Group rows](/user-docs/group-rows-in-baserow) - Organize with grouping +- [Row coloring](/user-docs/row-coloring) - Conditional formatting +- [Field customization](/user-docs/field-customization) - Field visibility and order +- [Row configuration](/user-docs/navigating-row-configurations) - Row height and display + +### View types +- [Grid view](/user-docs/guide-to-grid-view) - Spreadsheet interface +- [Gallery view](/user-docs/guide-to-gallery-view) - Visual card display +- [Form view](/user-docs/guide-to-creating-forms-in-baserow) - Data collection +- [Kanban view](/user-docs/guide-to-kanban-view) - Project boards +- [Calendar view](/user-docs/guide-to-calendar-view) - Event scheduling +- [Timeline view](/user-docs/guide-to-timeline-view) - Project timelines + +### Advanced features +- [Share a view publicly](/user-docs/public-sharing) - External sharing +- [Export a view](/user-docs/export-a-view) - Download data +- [Import data](/user-docs/import-data-into-an-existing-table) - Add records +- [Webhooks](/user-docs/webhooks) - External system notifications + +--- + + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/88f97d32-ed89-4c1a-a4fc-d78f00701c41/View%20configuration%20toolbar%20in%20Baserow.jpg + [2]: https://baserow.io/user-docs/date-and-time-fields + [3]: https://baserow.io/user-docs/duration-field + [4]: https://baserow.io/user-docs/date-dependency",,baserow_user_docs,https://baserow.io/user-docs/view-customization +13,Grid view,guide-to-grid-view,Baserow grid view: Organize and manage your data,"# Grid view + +Grid view displays your data in rows and columns like a traditional spreadsheet, making it the most versatile view type for detailed data work. + +This guide covers how to use Baserow's Grid view for spreadsheet-style data management, bulk operations, and detailed record editing. + +![Multi-row selection in Grid view](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/e9bc258a-093b-4993-b351-9f81fa2ebd18/views%20in%20baserow.png) + +## What is Grid view? + +**Grid view is Baserow's spreadsheet-style interface for managing data.** If you've used Microsoft Excel or Google Sheets, Grid view will feel immediately familiar. It's the default view for all new tables and offers the most comprehensive set of features for data manipulation. + +**Grid view excels at:** Bulk data entry, editing multiple records simultaneously, detailed data analysis, working with formulas and calculations, exporting filtered data, and managing large datasets with precision. + +Learn more about views in general: [Views overview](/user-docs/overview-of-baserow-views) + + + +## Grid view vs other view types + +| Feature | Grid | Gallery | Kanban | Calendar | Timeline | Form | +|---------|------|---------|--------|----------|----------|------| +| **Best for** | Detailed data work | Visual browsing | Status tracking | Date-based events | Project timelines | Data collection | +| **Data density** | High | Medium | Low | Medium | Medium | N/A | +| **Multi-row selection** | ✓ | – | – | – | – | – | +| **Manual reordering** | ✓ | – | – | – | – | – | +| **Field summaries** | ✓ | – | – | – | – | – | +| **All field types visible** | ✓ | Limited | Limited | Limited | Limited | Configurable | +| **Bulk editing** | ✓ | Limited | Limited | – | – | – | +| **Export capability** | ✓ | – | – | – | – | – | + +Learn more: [Gallery view](/user-docs/guide-to-gallery-view) | [Kanban view](/user-docs/guide-to-kanban-view) | [Calendar view](/user-docs/guide-to-calendar-view) + +## Create a Grid view + +Every new table includes a default Grid view automatically. To create additional Grid views: + +1. Click the **view dropdown** at the top-left of the table +2. Select **Grid** from the view type options +3. Choose [Collaborative](/user-docs/collaborative-views) or [Personal](/user-docs/personal-views) permission type +4. Enter a **name** for your Grid view +5. Click **Add view** + +![Creating a Grid view in Baserow](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/abf69f3512da8375640e8a31c84f7733dc9f1e5c.webp) + +The new Grid view initially displays all table data. Customize it with [filters](/user-docs/filters-in-baserow), [sorts](/user-docs/view-customization), and [field visibility](/user-docs/field-customization) to create focused views for specific workflows. + +## Select multiple rows + +Grid view's multi-row selection enables bulk operations on many records simultaneously. This is unique to Grid view; other view types don't support multi-row selection. + +### Using checkboxes + +1. Hover over the **row number** on the left side of any row +2. A checkbox appears, click it to select the row +3. Repeat for additional rows to build your selection +4. Selected rows highlight with a blue background + +### Using keyboard shortcuts + +1. Click a row to select it +2. Hold **Shift** and click another row +3. All rows between the first and last selection are selected +4. Use **Cmd/Ctrl + Click** to select non-contiguous rows + +### Bulk actions + +Once rows are selected, a toolbar appears at the top of the grid with available actions: + +- **[Delete rows][1]** - Remove all selected rows permanently +- **[Duplicate rows][2]** - Create copies of selected rows +- **[Export table][3]** - Download selected table or views only + +Learn more: [Multi-cell row selection for pasting][4] + +## Reorder rows manually + +Grid view lets you manually arrange row order by dragging, which is particularly useful when automatic sorting doesn't match your needs. + +**Drag handle:** Click and hold the **drag handle** (⋮⋮) on the left side of any row, then drag the row up or down to its new position. + +![Manual row reordering with drag handle](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/52b3d6d6bf91456aae9aabd55832450cd1b5cb12.webp) + +> Manual reordering only works when no automatic sorts are applied. If you've added sort conditions, remove them first to enable manual reordering. + +When you manually reorder rows, your custom order persists until you apply automatic sorting. This makes manual ordering perfect for priority lists, custom workflows, or any scenario where your judgment matters more than field-based sorting. + +## Adjust column width + +Control how much space each field occupies horizontally to optimize your view for the data you're working with. + +### Resize individual columns + +1. Hover over the **dividing line** between field headers +2. Your cursor changes to a resize indicator +3. **Click and drag** left or right to adjust width +4. A blue indicator shows the new width as you drag +5. Release to set the new width + +![Adjusting column width in Grid view](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/28a7e27d781acc3f58d382bc7dd915fb420edaa1.webp) + +### Auto-fit column width + +**Double-click** the dividing line between headers to automatically resize the column to fit its content perfectly. + +Width adjustments save per view, so different Grid views of the same table can have different column widths optimized for their specific purposes. + +## Field summaries + +Field summaries calculate summary statistics for each field, appearing at the bottom of the grid. This feature is unique to Grid view. + +Available summaries vary by field type. Field summaries respect active filters. If you filter to show 100 rows out of 1,000, summaries are calculated based only on the visible 100 rows. + +To configure summaries, scroll to the bottom of your Grid view. Click the **dropdown** in the footer row below any field -> Select the summary type you want to display. The calculated value appears immediately + +Learn more: [Field summaries](/user-docs/footer-aggregation) + +## Grid view toolbar options + +The toolbar at the top of Grid view provides quick access to common operations: + +**[Filter](/user-docs/filters-in-baserow)** - Show only records matching specific conditions + +**[Sort](/user-docs/view-customization)** - Order rows by field values automatically + +**[Group](/user-docs/group-rows-in-baserow)** - Organize rows into collapsible sections + +**[Hide fields](/user-docs/field-customization)** - Control which columns appear + +**[Row height](/user-docs/navigating-row-configurations)** - Adjust row size (short, medium, tall, extra tall) + +**[Share view](/user-docs/public-sharing)** - Generate public links or embed codes + +**[Row colors](/user-docs/row-coloring)** - Apply conditional formatting + +## Grid view keyboard shortcuts + +Speed up your workflow with keyboard shortcuts: + +**Navigation:** +- **Tab** - Move to next cell (right) +- **Shift + Tab** - Move to previous cell (left) +- **Enter** - Move to cell below +- **Shift + Enter** - Move to cell above +- **Arrow keys** - Navigate in any direction + +**Editing:** +- **Double-click** or **Enter** - Start editing cell +- **Esc** - Cancel editing without saving +- **Ctrl/Cmd + C** - Copy cell content +- **Ctrl/Cmd + V** - Paste into cell + +**Selection:** +- **Shift + Click** - Select multiple rows +- **Ctrl/Cmd + Click** - Add individual rows to selection +- **Ctrl/Cmd + A** - Select all visible rows + +Learn more: [Keyboard shortcuts](/user-docs/baserow-keyboard-shortcuts) + +## Grid view management + +Access view management options by clicking the **three-dot menu (⋮)** next to the view name: + +- **Export view** - Download filtered data as CSV, Excel, JSON, or XML +- **Duplicate view** - Copy configuration to a new view +- **Import file** - Add data from CSV, JSON, or XML files +- **Convert view type** - Change between collaborative and personal +- **Webhooks** - Configure external notifications +- **Rename view** - Update the view name +- **Delete view** - Remove the view + +Learn more: [View configuration options](/user-docs/view-customization) + +## Why use Grid view? + +Grid view is the most powerful view type for detailed data work. Unlike specialized views (kanban, calendar, gallery) designed for specific use cases, Grid view provides complete access to all your data with maximum flexibility. + +**Comprehensive data access:** See all fields at once without switching between specialized views. Every field type displays in Grid view, from simple text to complex formulas. + +**Bulk operations:** Select and modify multiple rows simultaneously. Perform actions like delete, duplicate, or export on dozens or hundreds of records at once. + +**Spreadsheet familiarity:** Users familiar with Excel or Google Sheets can start working immediately without learning new interfaces. Standard spreadsheet conventions (cell selection, keyboard shortcuts, inline editing) all work as expected. + +**Advanced features:** Grid view uniquely supports field summaries, manual row reordering, multi-row selection, and detailed field width customization that other view types don't offer. + +## Frequently asked questions + +### Why can't I manually reorder rows in my Grid view? + +Manual reordering is disabled when automatic sort conditions are active. Click the **Sort** button in the toolbar and remove all sort conditions by clicking the X next to each one. Once sorts are removed, the drag handle (⋮⋮) becomes functional for manual reordering. + +### How many rows can the Grid view handle efficiently? + +Grid view performs well with tables containing tens of thousands of rows. For optimal performance with very large tables (100,000+ rows), use filters to reduce visible rows or consider pagination strategies. Field summaries calculate quickly, even on large filtered datasets. + +### Do field summaries work with filtered data? + +Yes. Field summaries are calculated based only on currently visible rows. If you apply filters that show 50 rows out of 500, summaries (sum, average, count) reflect only those 50 visible rows. + +### Can I copy multiple cells from Excel to Grid view? + +Yes. Copy cells from Excel or Google Sheets, click a cell in Grid view, and paste (Ctrl/Cmd + V). Baserow creates or updates rows and fields as needed to accommodate the pasted data. Learn more: [Paste data into cells](/user-docs/paste-data-into-baserow-table) + +### Why don't I see the Export option in my view menu? + +Export is only available from the Grid view menu (⋮) next to the view name. Other view types (gallery, kanban, calendar) don't have direct export options. Switch to Grid view or use table export to download data from other view types. + +### What's the difference between row height and column width? + +Row height (short, medium, tall, extra tall) affects vertical space and how much text displays in cells. Configure it from the view menu. Column width affects horizontal space per field and adjusts by dragging field header borders. Both settings save per view independently. + +## Related resources + +### View basics +- [Views overview](/user-docs/overview-of-baserow-views) - Understanding all view types +- [Create custom views](/user-docs/create-custom-views-of-your-data) - Step-by-step view creation +- [View configuration options](/user-docs/view-customization) - Filters, sorts, and settings + +### Grid view features +- [Filters in Baserow](/user-docs/filters-in-baserow) - Show specific records +- [Group rows](/user-docs/group-rows-in-baserow) - Organize with grouping +- [Field customization](/user-docs/field-customization) - Hide and reorder fields +- [Row configuration](/user-docs/navigating-row-configurations) - Row height and formatting +- [Row coloring](/user-docs/row-coloring) - Conditional formatting +- [Field summaries](/user-docs/footer-aggregation) - Calculate summaries + +### Data operations +- [Export a view](/user-docs/export-a-view) - Download grid data +- [Import data](/user-docs/import-data-into-an-existing-table) - Add records from files +- [Paste data](/user-docs/paste-data-into-baserow-table) - Copy from spreadsheets +- [Public sharing](/user-docs/public-sharing) - Share grids externally + +### Other view types +- [Gallery view](/user-docs/guide-to-gallery-view) - Visual card display +- [Kanban view](/user-docs/guide-to-kanban-view) - Project boards +- [Calendar view](/user-docs/guide-to-calendar-view) - Date-based scheduling +- [Form view](/user-docs/guide-to-creating-forms-in-baserow) - Data collection + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow.io/user-docs/navigating-row-configurations + [2]: https://baserow.io/user-docs/how-to-make-new-rows + [3]: https://baserow.io/user-docs/export-tables + [4]: https://baserow.io/user-docs/paste-data-into-baserow-table",,baserow_user_docs,https://baserow.io/user-docs/guide-to-grid-view +14,Gallery view,guide-to-gallery-view,Baserow gallery view guide: Organize your data,"# Gallery view + +Gallery view transforms your data into visual cards with cover images and customizable field layouts, making it ideal for portfolios, product catalogs, and any data where visuals matter. + +This guide shows how to use Baserow's Gallery view to display data as visual cards, perfect for browsing images, documents, and content-rich records. + +## What is Gallery view? + +Gallery view displays your data as visual cards instead of spreadsheet rows. Each record becomes a card that can feature a cover image, making the Gallery view perfect for browsing content where visual presentation matters more than detailed data manipulation. + +**Gallery view excels at:** Product catalogs with images, team directories with photos, portfolio management, document libraries, real estate listings, recipe collections, and any scenario where visual browsing improves the user experience. + +Learn more about views in general: [Views overview](/user-docs/overview-of-baserow-views) + +![Gallery view showing data as visual cards][1] + + +## Gallery view vs other view types + +| Feature | Gallery | Grid | Kanban | Calendar | +|---------|---------|------|--------|----------| +| **Best for** | Visual browsing | Detailed data work | Status tracking | Date-based events | +| **Data density** | Medium | High | Low | Medium | +| **Cover images** | ✓ Prominent | – | – | – | +| **Card customization** | ✓ | – | ✓ Limited | – | +| **Manual card ordering** | ✓ | ✓ Rows only | – | – | +| **Multi-line text display** | ✓ Comfortable | Limited | Limited | Limited | +| **Visual identification** | ✓ Excellent | Poor | Good | Good | + +Learn more: [Grid view](/user-docs/guide-to-grid-view) | [Kanban view](/user-docs/guide-to-kanban-view) | [Calendar view](/user-docs/guide-to-calendar-view) + +## Create a Gallery view + +1. Click the **view dropdown** at the top-left of the table +2. Select **Gallery** from the view type options +3. Choose [Collaborative](/user-docs/collaborative-views) or [Personal](/user-docs/personal-views) permission type +4. Enter a **name** for the Gallery view +5. Click **Create view** + +![Creating a gallery view in Baserow](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/Screenshot_2022-06-29_at_08.54.24.png) + +The new Gallery view displays all table records as cards. If your table has [file fields](/user-docs/file-field), you can configure one as the cover image. Customize which fields appear on cards using the ""Customize cards"" button. + +## Configure cover images + +The cover field determines which image appears prominently on each card. This is the defining feature of Gallery view; making visual content the focal point of each record. + +### Requirements for cover fields + +Your table must contain at least one [file field](/user-docs/file-field) to use cover images. File fields can contain images, PDFs, documents, or any uploaded files. When a file field contains an image, it displays as a visual thumbnail. Other file types show as file icons. + +### Set or change the cover field + +1. Click **Customize cards** in the Gallery view toolbar +2. Find the **Cover field** dropdown at the top +3. Select which file field to use as the cover +4. Choose **No cover** if you don't want cover images + +![Configuring the cover field in Gallery view](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/Screenshot_2022-06-14_at_20.51.10.png) + +**Multiple file fields:** If your table has multiple file fields (e.g., ""Product Photo"" and ""Technical Drawing""), you can choose which one appears as the card cover. Create different Gallery views with different cover fields to emphasize different visuals. + +**No file fields:** Gallery view still works without file fields. Cards display without cover images, showing only the configured fields. This is useful for text-heavy content where images aren't available or necessary. + +Cover images are visible when you [share the Gallery views publicly](/user-docs/public-sharing), making them perfect for external portfolios or catalogs. + +## Customize card content + +Control exactly which fields appear on gallery cards and in what order. This customization is unique to each Gallery view; different views can display different fields. + +### Hide or show fields on cards + +1. Click **Customize cards** in the Gallery view toolbar +2. **Toggle fields on/off** to show or hide them on cards +3. Use **Hide all** to hide everything except the cover +4. Use **Show all** to display all available fields +5. Use the **search box** to quickly find specific fields + +Green toggles (switched right) indicate visible fields. Gray toggles (switched left) indicate hidden fields. + +**Hidden fields strategy:** Hide fields that aren't useful for visual browsing. For example, in a product catalog gallery, hide internal fields like ""Supplier ID"" or ""Last Updated"" while showing customer-facing fields like ""Price"" and ""Description."" + +![Hide all and show all buttons for quick field management](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/068b6da1753bc07b4406e20d940fef74f0037464.webp) + +### Reorder fields on cards + +Field order on cards affects readability and emphasis. Put most important fields first. + +1. Click **Customize cards** in the Gallery view toolbar +2. **Click and drag** the drag handle (⋮⋮) next to any field name +3. Move the field up or down to its desired position +4. Release to set the new order + +![Reordering fields on gallery cards](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/9255efa902889b27c6c414bb365f5e3270c1be7a.webp) + +Field order saves per view. Create multiple Gallery views with different field arrangements optimized for different audiences or purposes. + +## Gallery view toolbar options + +The toolbar at the top of Gallery view provides quick access to common operations: + +**[Filter](/user-docs/filters-in-baserow)** - Show only cards matching specific conditions. Useful for creating filtered catalogs or specialized collections. + +**[Sort](/user-docs/view-customization)** - Order cards automatically by field values. Sort by price, date, name, or any field. + +**[Share view](/user-docs/public-sharing)** - Generate public links or embed codes to share your gallery externally. Perfect for portfolios or product showcases. + +**[Row colors](/user-docs/row-coloring)** - Apply conditional formatting to highlight specific cards based on field values. + +**Customize cards** - Configure cover images and control which fields appear on cards (covered above). + +## Manual card ordering + +When no automatic sorts are applied, you can manually arrange cards by dragging them. + +1. Ensure no sort conditions are active (remove them if present) +2. **Click and drag** any card to a new position +3. Drop the card in its new location +4. The manual order persists until you apply automatic sorting + +![Manual card reordering in Gallery view](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/00cae85389fd45b4acb1ad51b826fc311ffe51cc.webp) + +> Manual reordering is disabled when sort conditions are active. Remove all sorts first to enable drag-and-drop reordering. + +![Sort conditions prevent manual reordering](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/Screenshot_2022-06-30_at_16.47.59.png) + +Manual ordering is perfect for featured product lists, prioritized portfolios, or any scenario where your judgment matters more than field-based sorting. + +## Gallery view management + +Access view management options by clicking the **three-dot menu (⋮)** next to the view name: + +- **[Duplicate view][2]** - Copy configuration to a new view +- **[Import file][3]** - Add data from CSV, JSON, or XML files +- **[Convert view type][4]** - Change between collaborative and personal +- **[Webhooks][5]** - Configure external notifications +- **[Rename view][6]** - Update the view name +- **[Delete view][6]** - Remove the view permanently + +Learn more: [View configuration options](/user-docs/view-customization) + +## Why use Gallery view? + +Gallery view prioritizes visual presentation over data density. Unlike [Grid view's](/user-docs/guide-to-grid-view) spreadsheet interface, Gallery view makes images and visual content the focal point. + +**Visual-first browsing:** Cover images appear prominently on each card, making it easy to identify records at a glance. This is invaluable when working with product photos, profile pictures, document thumbnails, or any content where images convey key information. + +**Card-based layout:** Each record displays as an independent card with customizable field order. Cards show multiple lines of text comfortably, making Gallery view better than Grid view for content with long descriptions or notes. + +**Customizable card content:** Control which fields appear on cards and in what order. Hide irrelevant fields to keep cards clean and focused. Different Gallery views of the same table can show different fields on their cards. + +**Manual or automatic ordering:** Drag cards to rearrange them manually, or apply automatic sorts by any field. Manual reordering is particularly useful for prioritizing featured items or organizing content by preference. + +## Frequently asked questions + +### Can I use Gallery view without images? + +Yes. Gallery view works perfectly without cover images; cards simply display your configured fields without a visual header. This is useful for text-heavy content like blog posts, notes, or articles where images aren't available or necessary. + +### What happens if a file field is empty? + +Cards without cover images display a placeholder or show only the configured fields. This doesn't break the Gallery view; it just means that particular card lacks visual content. Consider using a default image or marking records that need images. + +### Can I have different cover images in different Gallery views? + +Yes. If your table has multiple file fields, each Gallery view can use a different one as its cover field. For example, create ""Product Photos"" gallery with the main product image and ""Technical Drawings"" gallery with engineering diagrams; both views showing the same records with different covers. + +### Why can't I drag cards to reorder them? + +Manual card reordering is disabled when automatic sort conditions are active. Click the **Sort** button in the toolbar and remove all sort conditions. Once sorts are cleared, you can drag cards freely. The sort and manual ordering are mutually exclusive. + +### How many fields should I show on gallery cards? + +This depends on your use case, but generally 3-6 fields keep cards readable. Too many fields make cards cluttered and hard to scan. Hide internal or administrative fields and show only what users need for browsing. You can always [expand cards](/user-docs/navigating-row-configurations#enlarging-rows) to see all fields. + +### Can I export Gallery view data? + +Gallery view doesn't have a direct export option. Switch to [Grid view](/user-docs/guide-to-grid-view) to access export functionality, or use [table export](/user-docs/export-tables) to download all data. The export will contain the same data; only the export access point differs. + +### Does Gallery view work with linked records? + +Yes. Gallery view displays up to 20 linked items by default. If you need to access more linked records, use the search functionality in the row select modal or adjust the linked table's view filters to show only relevant items. + +## Related resources + +### View basics +- [Views overview](/user-docs/overview-of-baserow-views) - Understanding all view types +- [Create custom views](/user-docs/create-custom-views-of-your-data) - Step-by-step view creation +- [View configuration options](/user-docs/view-customization) - Filters, sorts, and settings + +### Gallery view features +- [File field](/user-docs/file-field) - Upload images and documents for cover fields +- [Filters in Baserow](/user-docs/filters-in-baserow) - Show specific cards +- [Row coloring](/user-docs/row-coloring) - Highlight important cards +- [Public sharing](/user-docs/public-sharing) - Share galleries externally + +### Card customization +- [Field customization](/user-docs/field-customization) - Control field visibility +- [Row configuration](/user-docs/navigating-row-configurations) - Expand cards for details + +### Other view types +- [Grid view](/user-docs/guide-to-grid-view) - Spreadsheet interface +- [Kanban view](/user-docs/guide-to-kanban-view) - Project boards with cards +- [Calendar view](/user-docs/guide-to-calendar-view) - Date-based scheduling +- [Form view](/user-docs/guide-to-creating-forms-in-baserow) - Data collection + +--- + + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/88f97d32-ed89-4c1a-a4fc-d78f00701c41/View%20configuration%20toolbar%20in%20Baserow.jpg + [2]: https://baserow.io/user-docs/create-custom-views-of-your-data + [3]: https://baserow.io/user-docs/import-data-into-an-existing-table + [4]: https://baserow.io/user-docs/collaborative-views + [5]: https://baserow.io/user-docs/webhooks + [6]: https://baserow.io/user-docs/view-customization",,baserow_user_docs,https://baserow.io/user-docs/guide-to-gallery-view +15,Form view,guide-to-creating-forms-in-baserow,Baserow form view guide,"# Form view + +Form view transforms your table into shareable web forms for collecting data from anyone, with automatic validation and customizable thank-you pages. + +This guide covers how to create and customize Baserow forms for data collection, including field configuration, conditional logic, and submission handling. + +Learn more about views in general: [Views overview](/user-docs/overview-of-baserow-views) + +## What is Form view? + +Form view creates web forms automatically from your table fields. Instead of manually building forms from scratch, Form view generates a form based on your existing table structure. When someone submits your form, their responses create new rows in your table. + +**Form view excels at:** Customer feedback collection, lead generation, event registrations, survey responses, job applications, order forms, contact forms, and any scenario where you need external users to submit structured data. + + + +## Form view vs other view types + +| Feature | Form | Grid | Gallery | Kanban | +|---------|------|------|---------|--------| +| **Best for** | Data collection | Data management | Visual browsing | Status tracking | +| **External access** | ✓ Public submissions | Via sharing only | Via sharing only | Via sharing only | +| **Data entry mode** | Single record at a time | Bulk editing | Limited | Limited | +| **Automatic validation** | ✓ Built-in | Manual | Manual | Manual | +| **Conditional logic** | ✓ | – | – | – | +| **Pre-filling** | ✓ URL parameters | – | – | – | +| **Branding** | ✓ Logo & cover | – | ✓ Cover only | – | + +Learn more: [Grid view](/user-docs/guide-to-grid-view) | [Gallery view](/user-docs/guide-to-gallery-view) | [Kanban view](/user-docs/guide-to-kanban-view) + +## Create a Form view + +1. Click the **view dropdown** at the top-left of the table +2. Select **Form** from the view type options +3. Choose [Collaborative](/user-docs/collaborative-views) or [Personal](/user-docs/personal-views) permission type +4. Enter a **name** for your form view +5. Click **Create view** + +![Creating a form view in Baserow](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/5fe81ff9b5f9d3107f59248bfa9c74adcf5ea2bf.webp) + +All compatible table fields appear in your form automatically. Incompatible field types (Formula, Created on, Count, UUID, Rollup, Last modified, Lookup) are excluded automatically since they calculate or generate values automatically. + +## Form display modes + +Form view offers two display modes optimized for different scenarios. + +### Standard form mode + +All fields display on a single scrolling page. Best for short forms (1-9 questions), quick data entry, and forms where users need to see all fields at once. + +### Survey mode + +Fields display one at a time with navigation buttons. Best for long forms (10+ questions), mobile-optimized experiences, and higher completion rates on complex forms. Learn more: [Form survey mode][1] + +**Switch modes:** Click **Change mode** in the toolbar and select your preferred display option. + +## Configure form fields + +Control which fields appear on your form and how they're presented to form respondents. + +### Add or remove fields + +**[Create new fields][2]:** Click **+ Create new field** in the sidebar to add fields that don't exist in your table yet. The new field appears in both your form and table. + +**Add fields:** Select fields from the left sidebar to include them on your form. Click **Add all** to include all compatible fields at once. + +**Remove fields:** Click the **eye icon** next to any field to hide it from the form. Hidden fields don't appear to respondents but remain in your table. + +![Adding and removing form fields](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/Screenshot_2022-06-08_at_20.11.18.png) + +### Configure individual fields + +Click any field to access its configuration options: + +**Field label:** Customize how the field name appears on the form. For example, change ""email"" to ""Your email address"" for clarity. + +**Description:** Add helper text that appears below the field label to guide respondents. + +**Required toggle:** Make fields mandatory for form submission. Respondents cannot submit without completing required fields. + +![Configuring form field options](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/Screenshot_2022-06-29_at_02.58.22.png) + +### Field-specific options + +**[Single](/user-docs/single-select-field) and [Multiple select](/user-docs/multiple-select-field) fields:** Display as radio buttons (single) or checkboxes (multiple) for better user experience. Customize which options appear on the form. + +![Radio and checkbox components in forms](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/587eb53d-7665-4e3c-adb7-df81ec0923dc/New%20form%20components.png) + +**[Link-to-table](/user-docs/link-to-table-field) fields:** Choose between ""Single"" (dropdown) or ""Multiple"" (dropdown with + button to add more) selection modes. + +![Link to table field configuration](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/91f6e6ad-5cce-4153-9be8-3577f1f53476/Form.png) + +### Reorder fields + +**Standard mode:** Click and drag fields using the **drag handle (⋮⋮)** to reorder them directly in the form editor. + +![Reordering fields in standard form mode](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/e8d9422b0c45101399369e2c86c8b6303a0038a7.webp) + +**[Survey mode](/user-docs/form-survey-mode):** Click **Order fields** at the bottom to open a popup where you can drag fields to reorder them. + +![Reordering fields in survey mode](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/9176b5b4-fb11-4d46-a22a-7e279b6be296/fd2fc9d863fc0204cf5c8121256ad168f40cac9d.webp) + +> [Survey mode](/user-docs/form-survey-mode) works better for longer forms (10+ questions). Standard mode is better for shorter forms where users want to see all questions. + +## Brand your form + +Add visual elements to make forms match your organization's branding. + +### Add header and description + +Click the **header section** at the top of your form to add: +- **Title** - Main form heading +- **Description** - Explanatory text about the form's purpose + +### Add logo and cover image + +**Logo:** Click **Add a logo** and upload your organization's logo (appears in the form header). + +**Cover image:** Click **Add a cover image** in the gray area at the top and upload a banner image (appears above the form). + +![Form with logo and cover image](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/c95b49cd2a0d68714468cfae1670218215ada6ae.webp) + +Replace or remove images anytime by clicking them and selecting the appropriate option. + +### Customize submit button + +Click the **pencil icon** next to the Submit button to change its text. For example, change ""Submit"" to ""Register Now"" or ""Send Feedback."" + +![Customizing submit button text](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/Screenshot_2022-06-29_at_00.40.30.png) + +## Form conditions (conditional logic) + +Show or hide fields based on values entered in other fields. Conditional logic creates dynamic forms that adapt to respondent input. + +**How it works:** Define conditions similar to [Baserow filters](/user-docs/filters-in-baserow). When conditions are met, specified fields appear. When conditions aren't met, fields remain hidden. + +![Form conditions configuration](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/45d51db0-c72a-4ff6-9874-54cbd114f6b6/form%20conditions.png) + +Learn more about condition syntax: [Advanced filtering](/user-docs/advanced-filtering) + +## Configure post-submission behavior + +Control what respondents see after submitting your form. + +### Show a thank-you message + +Customize the message displayed on the submission confirmation page. Enter your message in the **Show a message** box. This is the default post-submission behavior. + +![Configuring thank-you message](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/Screenshot_2022-06-29_at_02.27.59.png) + +**Dynamic content:** Use `{row_id}` in your message to display the newly created record's ID. For example: ""Thank you! Your submission #{row_id} has been received."" + +### Redirect to a URL + +Send respondents to a specific webpage after submission. Enter the URL in the **Redirect to URL** field. This overrides the default thank-you page. + +Include `{row_id}` in redirect URLs to pass the record ID: `https://example.com/thank-you?id={row_id}` + +## Share and preview forms + +### Share your form + +Click **Share form** in the toolbar to generate a public link. Anyone with the link can submit your form without a Baserow account. + +Learn more: [Public sharing](/user-docs/public-sharing) + +![Sharing form publicly](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/Screenshot_2022-06-09_at_13.04.45.png) + +### Preview before sharing + +Click **Preview** in the toolbar to see your form as respondents will see it. This opens the form in a new tab with the public URL. + +![Previewing form](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/Screenshot_2022-06-09_at_13.07.53.png) + +Test all fields, conditions, and submission behavior before sharing with real users. + +### Form notifications + +Enable notifications to receive alerts when someone submits your form. Toggle **Receive form notifications** at the bottom of the form editor. + +Learn more: [Form submission notifications](/user-docs/notifications#notifications-for-new-form-submissions) + +## Pre-fill form fields + +Pre-fill forms with data using URL parameters, making it easier for respondents to complete forms with information you already know. + +**Common use case:** Pre-fill and hide fields that shouldn't be changed, like referral sources or campaign tracking codes. + +### Basic pre-fill syntax + +Add parameters to your form URL in this format: `?prefill_=value`. Spaces in the field name are replaced with `+` to avoid any issues with the query parameter. + +**Example:** Pre-fill a name field `?prefill_Name=John+Smith` + +### Pre-fill multiple fields + +Use `&` to separate multiple pre-filled fields: `?prefill_Name=John+Smith&prefill_Email=john@example.com` + +### Field-specific pre-fill formats + +**Single select:** A single select field can accept the value that is shown in the select dropdown `?prefill_single+select=Business` + +**Multiple select:** Separate values with commas `?prefill_multi+select=Marketing,Sales,Support` + +**Rating:** A rating field accepts a number to indicate how many stars should be filled. `?prefill_rating=4` + +**Link-to-table:** A link row field can accept the value that is shown in the select dropdown. `?prefill_link+row=Engineering` + +**Date:** A date field can accept a date in the following formats and will use the date format of the field to parse the date. (YYYY-MM-DD, DD/MM/YYYY, or MM/DD/YYYY) `?prefill_Start+Date=2024-01-15` + +### Hide fields dynamically + +Hide specific fields using URL parameters: `?hide_` + +**Example:** `?hide_Internal+Notes` + +Learn more in this blog: [Pre-fill forms with link row data](https://baserow.io/blog/use-link-row-data-pre-fill-forms) + +## View form submissions + +Form submissions automatically create new rows in your table. View submissions in any table view, though [Grid view](/user-docs/guide-to-grid-view) provides the most comprehensive access to all data. + +**Submission location:** New submissions appear at the bottom of grid view unless active filters hide them, active sorts move them to different positions, or the table has specific row ordering + +**Real-time updates:** Submissions appear immediately in your table. Multiple team members can monitor submissions simultaneously. + +## Form view toolbar options + +The toolbar at the top of the Form view provides quick access to: + +**Share form** - Generate public links (covered above) + +**[Change mode](/user-docs/form-survey-mode)** - Switch between standard form and survey mode + +**Preview** - See form as respondents see it (covered above) + +Form view also has the standard view management menu (⋮) with options for duplicate, rename, delete, webhooks, and view type conversion. + +## Why use Form view? + +Form view bridges the gap between your internal database and external data collection. Unlike other view types designed for browsing or managing existing data, the Form view focuses entirely on creating new records from external submissions. + +**No manual form building:** Forms automatically include all compatible table fields. Add, remove, or reorder fields without starting over. Changes to your table structure update the form automatically. + +**Built-in validation:** Required fields, field types, and conditional logic ensure data quality. Forms only accept properly formatted data based on your field configurations. + +**Instant database updates:** Form submissions immediately create new rows in your table, visible in [Grid view](/user-docs/guide-to-grid-view) and other views. No manual data entry or import required. + +**Flexible sharing:** Generate public form links to share with anyone, or [embed forms](/user-docs/public-sharing) in websites using iframes. Forms work without Baserow accounts or workspace access. + +## Frequently asked questions + +### Which field types work with Form view? + +Most field types work in forms. **Compatible:** Text, Number, Rating, Boolean, Date, URL, Email, File, Single select, Multiple select, Phone number, Link-to-table, Collaborator, Duration, Password. **Incompatible:** Formula, Created on, Count, UUID, Rollup, Last modified, Last modified by, Lookup (these calculate automatically and don't need user input). + +### Can I edit form submissions after they're submitted? + +Forms only create new records; they don't edit existing ones. Once submitted, responses become regular table rows that you can edit manually in Grid view or other views. For editing existing data, share appropriate views instead of forms. + +### How do I prevent duplicate form submissions? + +Forms don't automatically prevent duplicates. Consider using [form conditions](#form-conditions-conditional-logic) to warn users, or manually review submissions in Grid view. For advanced deduplication, use [webhooks](/user-docs/webhooks) with external automation tools. + +### Can I require authentication for form submission? + +Standard form sharing creates public links accessible to anyone. For authenticated access, use view sharing instead of form sharing, or implement authentication through external tools that embed your form. Enterprise plans may have additional authentication options. + +### Do form submissions trigger notifications? + +Yes, if enabled. Toggle **Receive form notifications** at the bottom of the form editor. You'll receive notifications when anyone submits the form. Learn more: [Form submission notifications](/user-docs/notifications#notifications-for-new-form-submissions) + +### Can I accept file uploads through forms? + +Yes. File fields in your table become file upload fields in forms. Respondents can upload files directly through the form, and the uploads attach to the created row. Consider file size limits and storage implications for public forms. + +### How do I test forms without creating real data? + +Use [preview mode](#preview-before-sharing) to see the form, but any submission creates real data. Create a test table for form testing, or manually delete test submissions from your production table. Consider adding a ""Test submission"" checkbox field to identify and filter out test data. + +### Can I use forms in survey mode? + +Yes. [Survey mode](/user-docs/form-survey-mode) displays one question at a time instead of all fields on one page. Click **Change mode** in the toolbar to switch between standard and survey modes. Survey mode is better for longer forms with many questions. + +## Related resources + +### Form features +- [Form survey mode](/user-docs/form-survey-mode) - One question at a time +- [Public sharing](/user-docs/public-sharing) - Share forms externally +- [Form notifications](/user-docs/notifications#notifications-for-new-form-submissions) - Get alerts for submissions +- [Webhooks](/user-docs/webhooks) - Automate actions on submission + +### View basics +- [Views overview](/user-docs/overview-of-baserow-views) - Understanding all view types +- [Create custom views](/user-docs/create-custom-views-of-your-data) - Step-by-step view creation +- [View configuration options](/user-docs/view-customization) - General view settings + +### Related field types +- [Link-to-table field](/user-docs/link-to-table-field) - Dropdown selections +- [Single select field](/user-docs/single-select-field) - Radio button options +- [Multiple select field](/user-docs/multiple-select-field) - Checkbox options +- [File field](/user-docs/file-field) - File uploads in forms + +### Other view types +- [Grid view](/user-docs/guide-to-grid-view) - View form submissions +- [Gallery view](/user-docs/guide-to-gallery-view) - Visual browsing +- [Kanban view](/user-docs/guide-to-kanban-view) - Status tracking + +### Advanced tutorials +- [Pre-fill forms with link row data](https://baserow.io/blog/use-link-row-data-pre-fill-forms) - Dynamic form data + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow.io/user-docs/form-survey-mode + [2]: https://baserow.io/user-docs/adding-a-field",,baserow_user_docs,https://baserow.io/user-docs/guide-to-creating-forms-in-baserow +16,Kanban view,guide-to-kanban-view,Kanban view in Baserow,"# Kanban view + +Kanban view displays records as cards organized into columns, making it perfect for tracking work through stages like sales pipelines, project workflows, or content production. + +This guide covers how to use Baserow's kanban view for visual workflow management with drag-and-drop cards organized by status or category. + +> **Premium feature:** Kanban view requires [paid plans](/user-docs/pricing-plans). Users on the free plan cannot create kanban views. + +Learn more about views in general: [Views overview](/user-docs/overview-of-baserow-views) + +## What is Kanban view? + +Kanban view organizes records into vertical columns based on a Single select field. Each column represents a status, stage, or category, and each record displays as a card that you can drag between columns to update its status. This visual workflow makes it easy to see work in progress and identify bottlenecks. + +**Kanban view excels at:** Sales pipelines (Lead → Qualified → Proposal → Closed), bug tracking (New → In Progress → Testing → Resolved), content calendars (Idea → Draft → Review → Published), recruitment workflows (Applied → Screening → Interview → Hired), and any process with clear stages. + + + +## Kanban view vs other view types + +| Feature | Kanban | Grid | Gallery | Calendar | +|---------|--------|------|---------|----------| +| **Best for** | Status tracking | Detailed data work | Visual browsing | Date-based events | +| **Organization** | By status columns | By rows | By cards | By dates | +| **Status updates** | Drag between columns | Edit field | Edit field | Drag to dates | +| **Visual workflow** | ✓ Excellent | Poor | Medium | Medium | +| **Data density** | Low (cards) | High (rows) | Medium (cards) | Medium | +| **Bulk operations** | Limited | ✓ Extensive | Limited | Limited | +| **Premium feature** | Yes | No | No | No | + +Learn more: [Grid view](/user-docs/guide-to-grid-view) | [Gallery view](/user-docs/guide-to-gallery-view) | [Calendar view](/user-docs/guide-to-calendar-view) + +## Create a Kanban view + +Kanban views require a [Single select field](/user-docs/single-select-field) to define columns. Each option in the Single select field becomes a column on your kanban board. + +### Prerequisites + +Your table must have at least one Single select field. If you don't have one: +1. Create a Single select field before creating the Kanban view +2. Add options for each stage (e.g., ""To Do,"" ""In Progress,"" ""Done"") +3. Optionally, populate existing records with appropriate status values + +### Create the view + +1. Click the **view dropdown** at the top-left of the table +2. Select **Kanban** from the view type options +3. Choose [Collaborative](/user-docs/collaborative-views) or [Personal](/user-docs/personal-views) permission type +4. Enter a **name** for your kanban view +5. **Select the Single select field** that determines columns (or create a new one) +6. Click **Create view** + +![Creating a kanban view in Baserow](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/ffff8e973fc8938d864854f21df2c1cd23813dba.webp) + +Cards appear in columns based on their Single select field values. Records without a value appear in the ""Uncategorized"" column. + +## Organize cards by status + +The kanban board organizes around a Single select field that defines your workflow stages. + +### Stacked by field + +The toolbar shows which Single select field currently organizes your kanban board: **""Stacked by [field name]""** + +**Change the stacked-by field:** +1. Click **Stacked by [field]** in the toolbar +2. Select a different Single select field from the dropdown +3. Or create a new Single select field with different options + +![Changing stacked-by field in kanban](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/Screenshot_2022-06-30_at_12.22.54.png) + +The kanban reorganizes immediately, with cards redistributing into columns based on the new field's values. + +### Uncategorized column + +Records where the stacked-by field is empty appear in the ""Uncategorized"" column. This helps identify records that need status assignment. + +**Moving cards to uncategorized:** Drag a card into the Uncategorized column to clear its status value. The Single select field becomes empty. + +**Moving cards from uncategorized:** Drag a card from Uncategorized to any other column to assign it that status. + +## Move cards between columns + +Drag-and-drop is the primary interaction in Kanban view, making status updates intuitive and quick. + +### Update card status + +1. **Click and hold** any card +2. **Drag** to the target column +3. **Release** to drop the card + +The card's Single select field updates automatically to match the new column. This change syncs across all views; you'll see the updated status in [Grid view](/user-docs/guide-to-grid-view) and other views immediately. + +### Reorder cards within columns + +Cards within a column can be reordered manually: +1. **Drag a card** up or down within its current column +2. Drop it at the desired position +3. Manual order persists until you apply automatic sorts + +Manual ordering lets you prioritize cards within each stage without changing their status. + +![Drag-and-drop cards between columns](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/b65ec8644393629b8edabb042ec57937edf61317.webp) + +## Customize card content + +Control what information displays on kanban cards to show the most relevant data for quick decision-making. + +### Customize cards interface + +Click **Customize cards** in the toolbar to access card configuration options: + +**Cover field:** Display a [File field](/user-docs/file-field) image at the top of each card for visual identification (products, profiles, documents). + +**Search fields:** If you have many fields, use the search box to quickly find specific fields to show or hide. + +**Field visibility:** Show or hide specific fields on cards using toggles. Green toggle (switched right) = visible. Gray toggle (switched left) = hidden. + +**Field order:** Drag fields using the handle (⋮⋮) to reorder how they appear on cards. + +**Quick actions:** Use **Hide all** or **Show all** buttons to quickly toggle all fields at once. + +![Customizing kanban card content](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/5efd32bf0beee1572609c827fcf05e0b5f0eb944.webp) + +### Cover field setup + +The cover field displays images from a File field at the top of each card, making visual identification easier. + +**Requirements:** +- Table must have at least one [File field](/user-docs/file-field) +- Works best with image files (photos, logos, screenshots) +- Other file types show file icons instead of previews + +**Configure cover:** +1. Click **Customize cards** +2. Select a File field from the **Cover field** dropdown +3. Choose **No cover** to remove cover images + +Cover images appear when you [share Kanban views publicly](/user-docs/public-sharing). + +### Reorder card fields + +Field order on cards affects how quickly you can scan information. Put the most important fields first. + +1. Click **Customize cards** in the toolbar +2. **Drag the handle (⋮⋮)** next to any field name +3. Move fields up or down to desired position +4. Close to save changes + +![Reordering fields on kanban cards](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/Screenshot_2022-06-15_at_08.07.43.png) + +## Manage columns (stacks) + +Columns in the Kanban view correspond to options in your Single select field. Column management affects the field itself and all views using that field. + +### Create cards in columns + +Add new records directly from the kanban board: + +1. Click the **three-dot menu (⋮⋮⋮)** at the top of any column +2. Select **Create card** +3. Fill in field values for the new record +4. Click **Create** + +![Creating new cards in kanban](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/Screenshot_2022-06-14_at_20.56.17.png) + +The new card appears in the column you created it from, with the Single select field automatically set to that column's value. + +### Edit column properties + +Customize how columns appear on your board: + +1. Click the **three-dot menu (⋮⋮⋮)** at the top of a column +2. Select **Edit stack** +3. Change the **column name** (updates the select option name) +4. Change the **color scheme** for visual differentiation +5. Click **Change** to save + +Color coding helps distinguish stages visually: red for urgent, yellow for review needed, green for complete. + +### Delete columns + +**Warning:** Deleting a column deletes the corresponding single select option, which clears that value from all records. This cannot be undone. + +1. Click the **three-dot menu (⋮⋮⋮)** at the top of the column +2. Select **Delete stack** +3. Confirm the deletion + +Cards in the deleted column move to ""Uncategorized"" with their status cleared. + +## Kanban view toolbar options + +The toolbar at the top of Kanban view provides quick access to common operations: + +**[Filter](/user-docs/filters-in-baserow)** - Show only cards matching specific conditions. Useful for focusing on high-priority items or specific assignees. + +**[Share view](/user-docs/public-sharing)** - Generate public links or embed codes to share your kanban board externally. + +**[Row colors](/user-docs/row-coloring)** - Apply conditional formatting to highlight specific cards based on field values. + +**Stacked by** - Change which Single select field organizes columns (covered above). + +**Customize cards** - Configure card content and appearance (covered above). + +Each of these features has detailed documentation at the linked pages. + +## Kanban view management + +Access view management options by clicking the **three-dot menu (⋮)** next to the view name: + +- **[Duplicate view][1]** - Copy configuration to a new view +- **[Import file][2]** - Add data from CSV, JSON, or XML files +- **[Convert view type][3]** - Change between collaborative and personal +- **[Webhooks][4]** - Configure external notifications when cards move +- **[Rename view][5]** - Update the view name +- **[Delete view][5]** - Remove the view permanently + +Learn more: [View configuration options](/user-docs/view-customization) + +![Kanban view showing cards organized by status](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/52f03c5a-abc4-4eb1-8687-4db83ae1fcc5/kanban_view.png) + +## Why use Kanban view? + +Kanban view provides visual workflow management that's impossible to replicate in [Grid view](/user-docs/guide-to-grid-view) or other view types. The column-based layout makes process stages immediately visible. + +**Visual workflow clarity:** See all work stages at once. Identify bottlenecks where cards accumulate and spot empty columns that need attention. This bird's-eye view reveals workflow health instantly. + +**Intuitive status updates:** Drag cards between columns to update status; no field editing required. The visual action of moving a card matches the mental model of progressing work through stages. + +**Team coordination:** Everyone sees the same board layout, making kanban ideal for team collaboration. Stand-up meetings become easier when the entire workflow displays visually. + +**Flexible card content:** Customize which fields appear on cards to show the most relevant information for quick decision-making without opening full records. + +## Frequently asked questions + +### Can I have multiple Kanban views with different columns? + +Yes, but each Kanban view uses a Single select field to define columns. Create multiple Single select fields (e.g., ""Status"" and ""Priority"") and create separate Kanban views for each. You can't stack by multiple fields simultaneously in one Kanban view. + +### What happens to cards when I delete them? + +Right-clicking a card shows a **Delete** option that removes the record from your table. The deletion affects all views; the record disappears from the Grid view, other kanban boards, and everywhere else. Always verify card content before deleting to prevent data loss. Learn more: [Delete row][6]. + +### Can I sort cards within columns automatically? + +Yes. Apply [sorts](/user-docs/view-customization) from the toolbar to automatically order cards within each column by any field (priority, due date, value). Automatic sorting disables manual drag-to-reorder within columns. + +### Why are some cards missing from my Kanban view? + +Cards may be hidden by active [filters](/user-docs/filters-in-baserow). Check the toolbar for filter indicators. Also verify the stacked-by field; cards where that field is empty appear in ""Uncategorized"" which may be off-screen if you have many columns. + +### Can I change which field determines columns? + +Yes. Click **Stacked by [field]** in the toolbar and select a different Single select field. The kanban reorganizes immediately with new columns based on the selected field's options. All cards are rearranged into appropriate columns. + +### Do kanban changes sync to other views instantly? + +Yes. When you drag a card between columns, the status field updates immediately across all views. Team members viewing Grid view or other kanban boards see the change in real-time (with a page refresh if needed). + +### Can I export Kanban view data? + +Kanban view doesn't have direct export. Switch to [Grid view](/user-docs/guide-to-grid-view) to access export functionality, or use [table export](/user-docs/export-tables) to download all data. The export contains the same data; only the access point differs. + +### How many columns can a Kanban view have? + +You can have as many columns as options in your Single select field. However, many columns (20+) require horizontal scrolling and may reduce usability. Consider if multiple Kanban views with different Single select fields would organize your workflow better. + +## Related resources + +### View basics +- [Views overview](/user-docs/overview-of-baserow-views) - Understanding all view types +- [Create custom views](/user-docs/create-custom-views-of-your-data) - Step-by-step view creation +- [View configuration options](/user-docs/view-customization) - General view settings + +### Kanban features +- [Single select field](/user-docs/single-select-field) - Required for kanban columns +- [File field](/user-docs/file-field) - For card cover images +- [Filters in Baserow](/user-docs/filters-in-baserow) - Focus on specific cards +- [Row coloring](/user-docs/row-coloring) - Highlight important cards +- [Public sharing](/user-docs/public-sharing) - Share kanban boards externally + +### Related field types +- [Collaborator field](/user-docs/collaborator-field) - Assign cards to team members +- [Date field](/user-docs/date-and-time-fields) - Track due dates and timelines + +### Other view types +- [Grid view](/user-docs/guide-to-grid-view) - Spreadsheet interface +- [Gallery view](/user-docs/guide-to-gallery-view) - Visual card display +- [Calendar view](/user-docs/guide-to-calendar-view) - Date-based scheduling +- [Form view](/user-docs/guide-to-creating-forms-in-baserow) - Data collection + +### Plans and features +- [Pricing plans](/user-docs/pricing-plans) - Feature availability by plan + +--- + + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow.io/user-docs/create-custom-views-of-your-data + [2]: https://baserow.io/user-docs/import-data-into-an-existing-table + [3]: https://baserow.io/user-docs/collaborative-views + [4]: https://baserow.io/user-docs/webhooks + [5]: https://baserow.io/user-docs/view-customization + [6]: https://baserow.io/user-docs/navigating-row-configurations",,baserow_user_docs,https://baserow.io/user-docs/guide-to-kanban-view +17,Row configuration,navigating-row-configurations,Exploring row configurations in Baserow,"# Row configuration options + +Row configuration in Baserow gives you flexible control over how your data appears and behaves, from adjusting visual density to managing bulk operations on hundreds of records. + +This guide explains how to customize, organize, and manage rows in Baserow tables, including reordering, height adjustments, selection methods, and editing capabilities. + +![Creating a new row in Baserow image][1] + + + +## Overview + +Row configuration options determine how you interact with and display data in your Baserow tables. These settings affect the visual appearance of your rows, how you select and manipulate data, and how efficiently you can perform bulk operations. + +Baserow offers three main categories of row configuration: visual customization (height and display), data management (editing, reordering, deleting), and selection tools (single, multi-select, and bulk operations). Understanding these options helps you optimize your workspace for different types of data and workflows. + +For foundational concepts about rows, see the [rows overview][2] guide. + +## Row configuration capabilities + +| Configuration type | Options available | Use case | +|-------------------|-------------------|----------| +| Row height | Small, Medium, Large | Adjust for multi-line text or compact viewing | +| Row ordering | Drag and drop | Manual organization (when sorting is disabled) | +| Row selection | Single, range (Shift), non-adjacent (Ctrl/Cmd) | Bulk operations up to 200 rows | +| Row editing | Inline, row detail panel, bulk paste | Quick updates or comprehensive editing | +| Row deletion | Individual or bulk delete | Data cleanup with trash recovery period | + +## How to adjust row height + +Row height configuration improves readability for different content types. Baserow offers three height options to accommodate various data displays: + +- **Small** (default) - Compact view for tables with short text +- **Medium** - Balanced view for mixed content +- **Large** - Expanded view for multi-line text or detailed content + +**To change row height:** + +1. Open your table in Grid View +2. Click the **Height** button in the top bar +3. Select your desired size (Small, Medium, or Large) + +The height adjustment applies immediately to all rows in the current view. Learn more about [enlarging rows][3] for detailed content viewing. + +![Configurable row height options in Baserow](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/ebd1746b-c0f7-4c29-9ade-0487d662fcfb/configurable_row_height.webp) + +## How to reorder rows + +Manual row reordering lets you organize records in custom sequences that make sense for your workflow. + +**To reorder rows:** + +1. Locate the row you want to move +2. Click and hold the drag handle `⠿` on the left side of the row +3. Drag the row to its new position +4. Release to drop the row in place + +> Row reordering only works when manual sorting is disabled. If your view has active sorts, remove them first to enable drag-and-drop reordering. Learn about [sorting in Grid View][4] for more details. + +![Reordering rows by dragging](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/f00b44c936cd82e88fd06db1127de5df3358dc20.webp) + +## How to select rows + +Row selection enables bulk operations like editing, deleting, or copying multiple records simultaneously. + +### Single row selection +Click the row number on the left side to select an entire row. + +### Range selection +1. Click the first row number +2. Hold **Shift** and click the last row number +3. All rows between are selected + +### Non-adjacent selection +1. Click the first row number +2. Hold **Ctrl** (Windows) or **Cmd** (Mac) +3. Click additional row numbers to add them to your selection + +### Multi-row drag selection +Click and drag your mouse across multiple row numbers to select them quickly. + +**Selection limit:** Baserow limits selections to 200 rows at once due to lazy loading, which loads rows progressively as you scroll. This design allows efficient handling of tables containing millions of rows without downloading everything upfront. + + +## How to edit rows + +Baserow provides multiple methods for editing row data depending on your needs: + +### Inline editing +Click directly into any cell to edit its value. Changes save automatically when you press Enter or move to another cell. + +### Row detail panel +Click the [enlarge icon][5] on any row to open a comprehensive view showing all fields for that record. This panel is ideal for editing multiple fields in a single row. + +### Bulk editing with paste +Copy data from spreadsheets or other sources and paste it directly into your table using **Ctrl/Cmd + V**. Baserow maps the pasted data to your selected cells automatically. See [pasting data into cells][6] for detailed instructions. + +![Copying and pasting data between rows](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/c4e458d6-32fa-404a-b35a-e9f1df26d1af/Moving%20rows%20using%20copy-and-paste%20functions.webp) + + +## How to copy rows + +Copying rows in Baserow allows you to quickly duplicate or share data between tables, projects, or collaborators. Depending on your needs, you can copy a single row’s URL for quick reference or copy multiple rows with or without headers for use in spreadsheets or other tools. + +### Copy row URL +1. Navigate to the row you want to copy +2. Right-click the row to open the context menu +3. Select **Copy row URL** + +### Copy multiple rows +1. Select multiple rows using [any selection method][7] +2. Click the **Copy cells** or **Copy cells with header** + + +When you paste the copied content into a spreadsheet application like Excel or Google Sheets, each value will appear in its corresponding cell. If you include headers, they’ll appear in the first row, making it easier to map or import your data elsewhere. + +![Image copy rows in Baserow][8] + +## How to delete rows + +Delete individual rows or multiple rows at once. Deleted rows move to trash with a [grace period][9] for recovery. + +### Delete a single row +1. Navigate to the row you want to delete +2. Right-click the row to open the context menu +3. Select **Delete row** + +### Delete multiple rows +1. Select multiple rows using [any selection method][7] +2. Press the **Delete** key, or right-click and choose **Delete rows** + +> Once the [trash grace period][9] expires, deletion becomes permanent. Recover deleted rows from the trash before the period ends. + +![Deleting a row via context menu][1] + +## Frequently asked questions + +### Why can't I reorder rows in my table? + +Row reordering is disabled when your view has active sorting applied. To enable drag-and-drop reordering, remove all sorts from your Grid View by clicking the sort button and clearing any active sort rules. + +### How many rows can I select at once? + +You can select up to 200 rows at a time. This limit exists because Baserow uses lazy loading to handle large tables efficiently, loading rows as you scroll rather than loading entire tables into memory. + +### Do row height changes affect all views? + +No, row height settings are view-specific. You can set different row heights for different views of the same table, allowing you to optimize each view for its specific purpose. + +### Can I recover deleted rows? + +Yes, deleted rows move to trash with a [grace period][9] for recovery. Access the trash to restore rows before the [grace period][9] expires. After expiration, deletion is permanent, and rows cannot be recovered. + +### What's the fastest way to edit multiple rows with the same value? + +Select multiple cells in a column, type your new value, and press **Ctrl/Cmd + Enter** to apply the value to all selected cells simultaneously. This works for any field type that supports bulk editing. + +## Related content + +- [Rows overview][2] - Learn fundamental row concepts +- [Create a row][10] - Add new records to your tables +- [Paste data into cells][6] - Import data from spreadsheets +- [Row coloring][11] - Apply conditional formatting to rows +- [Row commenting and mentions][12] - Collaborate on specific records +- [Keyboard shortcuts][13] - Speed up row operations + +--- + + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/d81b0ee6-50c2-4358-b3e6-f8d19a6763a1/Row%20config.jpg + [2]: /user-docs/overview-of-rows + [3]: /user-docs/enlarging-rows + [4]: /user-docs/guide-to-grid-view + [5]: https://baserow.io/user-docs/enlarging-rows + [6]: /user-docs/paste-data-into-baserow-table + [7]: https://baserow.io/user-docs/navigating-row-configurations#how-to-select-rows + [8]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/9d18f38a-273b-40f3-a26b-67b395e3819f/How%20to%20copy%20rows.jpg + [9]: https://baserow.io/user-docs/data-recovery-and-deletion + [10]: /user-docs/how-to-make-new-rows + [11]: /user-docs/row-coloring + [12]: /user-docs/row-commenting + [13]: /user-docs/baserow-keyboard-shortcuts",,baserow_user_docs,https://baserow.io/user-docs/navigating-row-configurations +18,Collaboration overview,managing-workspace-collaborators,Baserow workspace collaboration overview,"# Collaboration overview + +Baserow provides multiple collaboration tools for teams to work together on databases, communicate about data, and manage access control. + +This guide covers how Baserow's collaboration features enable team communication, task delegation, workspace sharing, and permission management. + +## Baserow collaboration features + +Baserow enables team collaboration through workspaces, permissions, comments, and sharing. Multiple team members can work simultaneously on databases with real-time updates, role-based access control, and built-in communication features. + +**Core collaboration features:** +- **[Workspaces](/user-docs/intro-to-workspaces)** - Shared environments where teams organize databases and grant access +- **[Workspace members](/user-docs/working-with-collaborators)** - Invite users and assign roles +- **[Permissions](/user-docs/permissions-overview)** - Control who can view, edit, or administer data. +- **[Teams](/user-docs/create-and-manage-teams)** - Group workspace members for easier permission management +- **[Row comments](/user-docs/row-commenting)** - Discuss specific records with @mentions +- **[Collaborator field](/user-docs/collaborator-field)** - Assign tasks to specific workspace members +- **[Notifications](/user-docs/notifications)** - Stay informed about workspace activity +- **[Public sharing](/user-docs/public-sharing)** - Share views externally without workspace access +- **[Audit logs](/user-docs/admin-panel-audit-logs)** - Track who changed what + + + +## Workspace collaboration + +Workspaces are the foundation of team collaboration in Baserow. All databases, tables, and team access are organized within workspaces. + +### How workspace collaboration works + + - **[Create workspaces](/user-docs/intro-to-workspaces)** for different teams, projects, or departments. Each workspace contains its own databases, workspace members, and permissions, independent of other workspaces. + - **[Invite users to workspaces](/user-docs/working-with-collaborators) with appropriate roles**. Once they join, workspace members can access all databases based on their permission level. + - **Assign workspace roles** to control what users can do. Workspace admins manage workspace members and settings, while regular workspace members work with data. Control workspace member access by assigning roles at workspace, database, or table levels. + +Learn more: [Workspace permission levels overview](/user-docs/permissions-overview) | [Manage workspace members](/user-docs/manage-workspace-permissions) + +## Real-time collaboration + +Multiple team members can work simultaneously on the same database without conflicts. + +**What's real-time:** +- Data changes appear instantly for all workspace members viewing the same table +- Row additions, edits, and deletions sync immediately +- Comments and mentions notify workspace members in real-time +- View configurations update when changed by other workspace members (collaborative views) + +**What's not real-time:** +- Personal view configurations remain private +- Undo/redo operates on individual user actions only +- Browser refresh may be needed occasionally to see updates + +Multiple workspace members can edit different rows simultaneously. If two users edit the same cell, the last save wins. + +## Communication features + +Built-in communication tools help teams discuss data without leaving Baserow. + +### Row comments and mentions + +Add comments directly to specific rows to discuss that record's data. Use @mentions to notify specific workspace members about the comment. + +**Comment features:** +- @mention workspace members to get their attention +- Reply to comments for threaded discussions +- Subscribe to row comments for automatic notifications +- Edit or delete your own comments +- See comment history and timestamps + +Learn more: [Row comments and mentions](/user-docs/row-commenting) + +### Collaborator field + +Assign specific workspace members to rows using the [collaborator field](/user-docs/collaborator-field). This creates clear ownership and accountability for records. + +**Use cases:** Assign tasks to workspace members, track who's responsible for each customer, designate reviewers for content, or show project ownership. + +Workspace members assigned as a collaborator receive [notifications][1] when assigned to rows (if enabled). + +### Notifications + +Stay informed about workspace activity through [in-app and email notifications](/user-docs/notifications). + +**Notification triggers:** Someone @mentions you in a comment, you're invited to a workspace, you're assigned as a collaborator to a row, form submissions (if you own the form), and webhooks or integrations fail + +Configure notification frequency (instant, daily, weekly, never) in account settings. + +## Teams for advanced access control + +Teams group workspace members for easier permission management. Assign permissions to teams instead of individual users. + +Teams simplify department-based access (Marketing team, Sales team), project-based permissions (Project A team, Project B team), and role-based access (Editors team, Reviewers team). + +Add or remove workspace members from the team once to update permissions everywhere the team has access. + +Learn more: [Create and manage teams](/user-docs/create-and-manage-teams) + +## Public sharing + +Share specific views with people outside your workspace without granting workspace access. + +Public sharing enables external stakeholders to view data without accounts, customer portals using filtered views, public forms for data collection, and embedded views in external websites. + +Configure public links with view-only or editable permissions based on needs. + +Learn more: [Public sharing](/user-docs/public-sharing) + +## Frequently asked questions + +### How many people can collaborate in a workspace? + +There's no hard limit on workspace members. Free plans have row and storage limits ([check your plan][2]), while paid plans support unlimited workspaces with unlimited members. Performance remains good even with dozens of simultaneous workspace members. + +### Can I see who's currently viewing a table? + +Not currently. Baserow doesn't show real-time presence indicators (who's online now). You can see who made changes through [row change history](/user-docs/row-change-history) and [audit logs](/user-docs/admin-panel-audit-logs) (Advanced/Enterprise). + +### What happens if two people edit the same cell simultaneously? + +The last person to save wins. Baserow uses ""last write wins"" conflict resolution. If two workspace members edit the same cell simultaneously, the second save overwrites the first. Use comments to coordinate edits on critical records. + +### Can workspace members see each other's personal views? + +No. [Personal views](/user-docs/personal-views) are completely private. Other workspace members, including admins, cannot see your personal view configurations. Only [collaborative views](/user-docs/collaborative-views) are visible to the team. + +### How do I remove someone's access to their workspace? + +Workspace admins can [remove workspace members](/user-docs/remove-a-user-from-a-workspace) through workspace settings. Navigate to workspace settings, find the member, and click remove. The user loses access immediately, but their historical contributions (comments, data changes) remain. + +### Can I collaborate across multiple workspaces? + +Yes. Users can belong to multiple workspaces simultaneously. Each workspace has independent permissions; admin in one workspace doesn't grant admin access in others. Switch between workspaces using the workspace switcher in the sidebar. + +### Do comments sync across views? + +Yes. Comments are attached to rows, not views. A comment made in Grid view appears in Kanban view, Gallery view, and all other views showing that row. Comments follow the data regardless of how you visualize it. + +## Related resources + +### Getting started +- [Introduction to workspaces](/user-docs/intro-to-workspaces) - Workspace basics +- [Invite users to a workspace](/user-docs/working-with-collaborators) - Add new users to your workspace +- [Manage workspace members](/user-docs/manage-workspace-permissions) - Member management + +### Permissions and access +- [Permissions overview](/user-docs/permissions-overview) - Role-based access control +- [Assign roles at workspace level](/user-docs/assign-roles-to-members-at-workspace-level) - Workspace permissions +- [Create and manage teams](/user-docs/create-and-manage-teams) - Group-based permissions (Advanced/Enterprise) +- [Remove a workspace member](/user-docs/remove-a-user-from-a-workspace) - Revoke access + +### Communication +- [Row comments and mentions](/user-docs/row-commenting) - In-row discussions +- [Notifications](/user-docs/notifications) - Stay informed +- [Collaborator field](/user-docs/collaborator-field) - Assign tasks + +### Sharing +- [Public sharing](/user-docs/public-sharing) - External sharing +- [Collaborative views](/user-docs/collaborative-views) - Shared view configurations +- [Personal views](/user-docs/personal-views) - Private view configurations + +### Tracking and auditing +- [Row change history](/user-docs/row-change-history) - Track modifications +- [Audit logs](/user-docs/admin-panel-audit-logs) - Instance-wide tracking (Advanced/Enterprise) + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow.io/user-docs/notifications + [2]: https://baserow.io/pricing",,baserow_user_docs,https://baserow.io/user-docs/managing-workspace-collaborators +19,Manage workspace members,manage-workspace-permissions,Manage Baserow workspace members,"# Manage workspace members + +Workspace admins control who has access to their workspaces and can modify member permissions as team needs change. + +This guide covers how to view workspace members, change permissions, search and sort users, and maintain proper access control for your workspace. + +## Who can manage workspace members + +Only workspace admins can manage workspace members. This includes viewing the full member list, changing roles, removing members, and managing pending invitations. + +If you're not a workspace admin and need to manage members, ask an existing admin to upgrade your role. + +> **Admin role cautions:** Maintain at least two workspace admins to prevent access issues if one admin becomes unavailable. Admins have billing access and full workspace control. + +Learn more: [Permissions overview](/user-docs/permissions-overview) + +## View workspace members + +Workspace members with the right permission can see everyone who has access to your workspace, including their roles and contact information. Other workspace members without permission cannot view the member list, change roles, or remove members. + +**From workspace settings:** +1. Open the **workspace** you want to manage +2. Click **workspace settings** dropdown in the home page +3. Select **Members** in the settings menu + +**From sidebar:** +1. Locate the workspace in the sidebar +2. Click the **Members** tab +3. The members page opens directly + +The members page shows the display name of each workspace member, contact email address, and current permission level. + +## Change member permissions + +Workspace admins can update member roles anytime to adjust access levels as responsibilities change. Free plans have simplified roles, while paid plans offer granular roles for [advanced permission management](/user-docs/permissions-overview). + +### Update a member's role + + 1. Open the **Members** page in workspace settings + 2. Find the member whose role you want to change + 3. Click the **role dropdown** next to their name + 4. Select the new role + 5. The role updates immediately + +**Permission changes take effect immediately.** The workspace member's access updates across all databases and tables in the workspace according to their new role. + +![Changing member permissions](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/29c1effc-2e9a-44c8-8b64-ae04a63b006b/Screenshot_2023-01-18_at_17.24.14.png) + +While increasing permissions may give workspace members more access to align with their responsibilities, note that [upgrading roles may increase subscription costs][1]. + +## Search and filter workspace members + +Find specific members quickly in large workspaces using search and sort functions. This is useful to find a specific workspace member to change their role, locate all members from a specific domain (e.g., ""@company.com""), verify if someone has workspace access, or identify members for removal during offboarding. + +### Search by name or email + +1. Locate the **search box** at the top of the Members page +2. Type a **name** or **email address** (partial matches work) +3. Results filter automatically as you type + +![Searching workspace members](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/3f6ee5bc-96ef-437e-b8cc-52f03d032d37/Screenshot%202023-01-05%20at%2017.56.45.png) + +### Sort the member list + +Click column headers to sort members by different criteria. Sort indicators (▴ ▾) show the current sort column and direction. Click again to reverse the sort order. + + - **Name column:** Alphabetically (A-Z ▴) or reverse (Z-A ▾) + - **Email column:** Alphabetically (A-Z ▴) or reverse (Z-A ▾) + - **Role column:** Grouped by permission level + +![Sorting workspace members](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/65e2ddc7-80d9-4ead-abf0-7faceb6d8ec5/Screenshot%202023-01-05%20at%2017.55.07.png) + +## Manage pending invitations + +Pending invitations have dedicated management controls to view and manage workspace invitations that haven't been accepted yet. + +On the **Invites** page, you can view all outstanding invitations, see invitation details, resend invitations that may have been lost, cancel invitations sent by mistake, or change roles before acceptance. + +Learn more: [View pending invites](/user-docs/working-with-collaborators) + +## Remove workspace members + +Workspace admins can remove members who no longer need access. The member loses workspace access immediately. Their historical contributions (comments, data changes) remain in the workspace for record-keeping. + +Learn more: [Remove a user from workspace](/user-docs/remove-a-user-from-a-workspace) + +## Workspace-level audit logs + +The audit log keeps track of every action performed in your Baserow workspace. The workspace-level audit log provides visibility to workspace admins about every action taken in a particular workspace. + +Learn more: [Audit logs](/user-docs/admin-panel-audit-logs) + +![Workspace audit log interface](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/e072fc62-e53e-45b5-8152-d75e4bd76249/Workspace-level%20audit%20log.png) + +## Frequently asked questions + +### Can regular workspace members see the full member list? + +No. Workspace members cannot access the member list. Only workspace admins can access, change roles and remove members. + +### What happens to a member's data when I remove them? + +Their historical contributions remain in the workspace. Comments, data changes, and created databases/tables stay intact for continuity. Their name appears in activity logs and change history. Only their future access is revoked. + +### Can I bulk update multiple member roles at once? + +Not directly. Update member roles individually through the members page. For large teams on paid plans, consider using [teams](/user-docs/create-and-manage-teams) for group-based permission management. + +### How do I know if someone accepted their workspace invitation? + +Check the **Members** page. Active members appear in the main **Members** list with their roles. Pending invitations show separately in an **Invites** section. + +### What's the difference between changing workspace roles and database roles? + +**Workspace roles** (this page) set default permissions across all databases in the workspace. **[Database-level roles](/user-docs/assign-roles-at-database-level)** override workspace roles for specific databases, enabling granular access control. + +### Do role changes affect members in other workspaces? + +No. Workspace permissions are independent. A user who's an admin in Workspace A might be a viewer in Workspace B. Role changes only affect the current workspace. + +## Related resources + +### Member management +- [Add workspace collaborators](/user-docs/working-with-collaborators) - Invite new members +- [Remove a user from workspace](/user-docs/remove-a-user-from-a-workspace) - Revoke access +- [Assign roles to members](/user-docs/assign-roles-to-members-at-workspace-level) - Permission configuration + +### Advanced permissions +- [Permissions overview](/user-docs/permissions-overview) - Role-based access control +- [Assign database-level roles](/user-docs/assign-roles-at-database-level) - Granular permissions (Advanced/Enterprise) +- [Assign table-level roles](/user-docs/assign-roles-at-table-level) - Specific table access (Advanced/Enterprise) +- [Create and manage teams](/user-docs/create-and-manage-teams) - Group-based permissions (Advanced/Enterprise) + +### Monitoring +- [Audit logs](/user-docs/admin-panel-audit-logs) - Track workspace activity (Advanced/Enterprise) +- [Notifications](/user-docs/notifications) - Stay informed about changes + +### Collaboration +- [Collaboration overview](/user-docs/managing-workspace-collaborators) - Team collaboration guide +- [Row comments](/user-docs/row-commenting) - Communicate with members + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow.io/user-docs/subscriptions-overview#who-is-considered-a-user-for-billing-purposes",,baserow_user_docs,https://baserow.io/user-docs/manage-workspace-permissions +20,Share view publicly,public-sharing,Public sharing of a Baserow view,"# Share a view publicly + +Baserow's public view sharing lets you share specific table views with anyone, no workspace membership required, while keeping full control over what data is visible. + +This guide covers how to create public share links for your Baserow views, control access with passwords, and customize what external stakeholders can see without granting workspace access. + +## Overview + +Public sharing is ideal when external collaborators need read-only access to specific data. For example, share project status with clients, showcase portfolio items to prospects, or collect form submissions from the public. Recipients see only what you choose to display through filters, hidden fields, and view configurations. + +Shared views update in real-time as your data changes. You can share [Grid][1], [Gallery][2], [Form][3], [Kanban][4], [Timeline][5], and [Calendar][6] views, each maintaining its original formatting and features. + + +## How public sharing works + +Anyone with a shared view link can access the view without logging in. You control visibility through: + +- **View type selection** – Choose which view (Grid, Form, Gallery, etc.) to share +- **Field visibility** – Hide sensitive columns before sharing +- **Filters and sorting** – Pre-configure how data appears +- **Password protection** – Restrict access to specific recipients +- **Link generation** – Create new URLs to revoke old access + +Shared views are read-only by default. Form views accept submissions but don't allow editing existing data. + + +## Share a view step-by-step + +### Create a shareable link + +1. Open the view you want to share +2. Click the **Share view** button in the top toolbar +3. Toggle **Create a private link** to generate a URL +4. Copy the link using the **Copy link** icon + +![Share view interface in Baserow][7] + +### Secure your shared link + +After creating a link, you can add security options: + +| Option | Purpose | Details | +|--------|---------|---------| +| **Restrict access with a password** | Require authentication | Toggle on password restriction to require authentication before viewing the form. Minimum 8 characters, stored encrypted | +| **Generate new URL** | Revoke old access | Click the refresh icon to create a new URL. The old link stops working or accepting form submissions immediately | +| **Disable shared link** | Stop all access | Can be re-enabled anytime | + +![Share view options in Baserow][8] + + +## Control what viewers see + +### Hide sensitive fields + +Hidden fields don't appear in shared views, even when rows are expanded. To hide fields: + +1. Use the **Hide fields** option in your view configuration +2. Select which columns to hide from external viewers +3. Share the view; hidden fields remain invisible + +Learn more about [field visibility options](/user-docs/field-customization). + +### Apply filters and sorting + +Viewers can see and use any filters or sorting you've configured. They can also add their own temporary filters without affecting your original view. Pre-configured filters help focus viewers on relevant data only. + +### Field summaries in Grid views + +When you share a Grid view with [field summaries](/user-docs/footer-aggregation) enabled (totals, averages, counts), those calculations appear at the bottom of the shared view. This provides quick insights without requiring viewers to calculate manually. + +![Field summaries in public view](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/0b8b0af7-7253-481a-a6e9-5aff6446afc9/footer%20aggregations%20in%20public%20grid%20views.png) + +### Allow export from a shared view + +When sharing a [Grid view][1], you will see an additional toggle in the **Share view** dialog: **""Allow export on shared view""**. + +By default, this option is turned off. When you enable it, an ""Export"" option appears on the public view page. This allows anyone with the link to export the data from that view. + +This is ideal for sharing reports or datasets with external partners who need to work with the data themselves. The export will respect all your active filters and hidden fields; public viewers can only download the exact data you've chosen to display. + +![Export publicly shared view in Baserow][9] + +## Share forms for data collection + +Forms work differently from other views; they accept new submissions from anyone with the link. + +To set up form sharing, + +1. Create and configure your form view +2. Click **Share form** in the top toolbar +3. Copy the generated URL to distribute + +To manage form access, click the refresh icon to create a new URL and stop accepting submissions via the old link immediately, toggle on password restriction to require authentication before viewing the form, and click **Disable shared link** to stop accepting new submissions without deleting the form itself. + +## Embed views + +You can embed any publicly shared view using an iframe: + +```html + +``` + +Replace `YOUR_SHARED_VIEW_URL` with the actual link from the Share view dialog. This works for all view types, including forms, galleries, and calendars. + + +## Remove Baserow branding + +Paid subscribers can hide the Baserow logo from shared views for a white-label experience. Learn more about [subscription options](/user-docs/subscriptions-overview). + +## Frequently asked questions + +### Can viewers edit data in shared views? + +No. All shared views are read-only except for Form views, which accept new submissions but don't allow editing existing rows. + +### Do changes to my view affect shared links? + +Yes. Changes to field visibility, filters, and sorting apply immediately to shared views. Viewers see your updates in real-time. + +### What happens when I generate a new URL? + +The old link stops working immediately for all recipients. You'll need to share the new URL with anyone who needs access. + +### Can I password-protect existing shared links? + +Yes. Add password protection at any time through the Share view dialog. Existing recipients will need the password on their next visit. + +### Do shared views count against my row limits? + +No. Shared views don't consume additional resources or count against storage limits. Only the underlying table data counts toward your plan limits. + + +## Related content + +- [Create custom views](/user-docs/create-custom-views-of-your-data) +- [View configuration options](/user-docs/view-customization) +- [Grid view guide](/user-docs/guide-to-grid-view) +- [Form view guide](/user-docs/guide-to-creating-forms-in-baserow) +- [Field visibility settings](/user-docs/field-customization) + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow.io/user-docs/guide-to-grid-view + [2]: https://baserow.io/user-docs/guide-to-gallery-view + [3]: https://baserow.io/user-docs/guide-to-creating-forms-in-baserow + [4]: https://baserow.io/user-docs/guide-to-kanban-view + [5]: https://baserow.io/user-docs/guide-to-timeline-view + [6]: https://baserow.io/user-docs/guide-to-calendar-view + [7]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/4cfea85c-f237-47db-9aff-5dc99e66e1ae/Share%20view%20interface.jpg + [8]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/8eb9e3eb-82d4-4b1f-8a03-83819ddd9fb5/Share%20view%20options.jpg + [9]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/5ccfdd06-7ff9-411c-86f3-08395064c101/Export%20publicly%20shared%20view.jpg",,baserow_user_docs,https://baserow.io/user-docs/public-sharing +21,Account settings,account-settings-overview,Baserow account settings overview guide,"# Account settings overview + +Account settings contain personal preferences and security options specific to your user account, separate from workspace or database settings. + +This guide covers how to access and manage your Baserow account settings, including profile information, password, notifications, database tokens, and account deletion. + +## What are account settings? + +Account settings control your personal Baserow profile, security, and preferences. These settings apply only to your individual account across all workspaces you belong to. Changes to account settings don't affect other users or workspace configurations. + +**Account settings include:** + - **Account** - Update your name and interface language + - **Two-factor authentication** - Add an extra layer of security to your account + - **[Password][1]** - Change your account password + - **[Email notifications][2]** - Configure notification preferences + - **[MCP server][3]** - Configure Model Context Protocol server access + - **[Database tokens][4]** - Generate API tokens for integrations + - **[Delete account][5]** - Permanently remove your Baserow account + +![Baserow Account settings image][6] + +## Access account settings + +Your account settings are accessible from any page in Baserow. + +1. Click your **workspace icon** or **workspace name** in the top-right corner +2. Select **My settings** from the dropdown menu +3. The account settings page opens with tabs for each setting category + +You can also **log out** directly from the account dropdown without opening settings. + +## Account settings sections + +### Account + +Update your display name and interface language preferences. + +**Display name:** The name shown to other workspace members in [comments](/user-docs/row-commenting), [row activity logs](/user-docs/row-change-history), and workspace member lists. + +**Interface language:** Choose your preferred language for the Baserow interface. This setting affects only your view; other users see their chosen language. + +**How to update:** + 1. Click the **Account** tab in the settings page + 2. Edit your **name** and **interface language** + 3. Click **Update account** + +### Password + +Change your account password for security or if you suspect unauthorized access. + +Learn more: [Password management](/user-docs/password-management) + +### Two-factor authentication (2FA) + +Two-factor authentication (2FA) protects your account by adding an extra layer of security. When enabled, you'll be required to enter a six-digit code from an authenticator app in addition to your password when logging in. + +**How to enable 2FA:** + +1. Navigate to your **Account settings** page. +2. Click the **Two-factor authentication** tab (or find the 2FA section). +3. Click the **Enable 2FA** button. +4. Select **Authenticator app (Recommended)**. We suggest using a trusted app such as: + * Google Authenticator + * Authy + * Microsoft Authenticator +5. Click **Continue**. +6. On the next screen: + 1. **Scan the QR code** using your authenticator app. + 2. **Enter the 6-digit code** shown in the app to confirm you have set it up correctly. +7. Your account is now protected with 2FA. You will also be provided with recovery codes; save these in a secure location. + +![2FA in Baserow][7] + +### Email notifications + +Configure which email notifications you receive for workspace activity, mentions, comments, and other events. + +**Notification types:** +- Row mentions and comments +- Workspace invitations +- Form submissions (if you own forms) +- Permission changes +- Workspace updates + +Learn more: [Notifications](/user-docs/notifications) + +### MCP server + +Configure Model Context Protocol server settings to enable AI assistant integration with your Baserow data. + +Learn more: [MCP server documentation](/user-docs/mcp-server) (when available) + +### Database tokens + +Generate personal API tokens to authenticate with Baserow's REST API for programmatic access to your databases. + +**Database tokens enable:** +- Reading and writing data via API +- Building custom integrations +- Automating workflows with external tools +- Connecting Baserow to thousands of services + +Learn more: [Database tokens](/user-docs/personal-api-tokens) + +### Delete account + +Permanently remove your Baserow account and all associated personal data. + +You can schedule the deletion of your account by entering your current password and clicking the button. Your account will be permanently deleted after 30 days. In the meantime, if you log in again, your account deletion will be cancelled. + +Learn more: [Delete your Baserow account](/user-docs/delete-your-baserow-account) + +## Account vs workspace settings + +Understanding the difference between account and workspace settings helps you make changes in the right place. + +| Setting type | Scope | Examples | Who can change | +|--------------|-------|----------|----------------| +| **Account settings** | Personal, all workspaces | Name, password, 2FA, notifications, tokens | Only you | +| **Workspace settings** | Specific workspace | Workspace name, members, permissions | Workspace admins | +| **Database settings** | Specific database | Database name, snapshots, API docs | Database admins | +| **Table settings** | Specific table | Table name, fields, views | Table editors | + +**Account settings** affect only your personal experience across all Baserows workspaces. **[Workspace settings](/user-docs/setting-up-a-workspace)** affect everyone in that specific workspace. + +## Sidebar customization + +Adjust the sidebar width to maximize screen space or improve navigation visibility. + +**Resize sidebar:** +1. Hover over the **edge** between sidebar and main content +2. Cursor changes to a **resize icon** +3. **Click and drag** left to collapse or right to expand +4. Release to set the new width + +![Collapsing sidebar in Baserow](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/6dafc367-4e93-4d19-9e1b-6cd8eb2e6fa1/Aug-01-202421-18-30-ezgif.com-video-to-webp-converter.webp) + +Collapsed sidebars hide content but show icons for workspace navigation. Your sidebar width preference persists across sessions. + +## Frequently asked questions + +### Can workspace admins change my account settings? + +No. Account settings are personal and private to each user. Workspace admins cannot change your password, name, 2FA settings, notification preferences, or other account settings. Only you control your account. + +### Do my account settings apply to all workspaces? + +Yes. Your display name, interface language, and notification preferences apply across all workspaces you belong to. You don't need separate settings for each workspace. + +### What happens to my account settings if I leave a workspace? + +Your account settings remain unchanged when you leave workspaces. Your name, password, and preferences persist. You only lose access to that specific workspace's data. + +### Can I use the same database token across multiple workspaces? + +Yes. [Database tokens](/user-docs/personal-api-tokens) authenticate you across all workspaces you have access to. One token can interact with databases in any workspace where you're a member, subject to your permissions in each workspace. + +### How do I change my email address? + +Email changes aren't currently available through account settings. Contact [Baserow support](/contact) for assistance changing your account email address, or contact your self-hosted instance admin. + +### Will changing my display name affect existing comments or activity logs? + +Yes. Your display name updates in the interface and all historical comments and activity logs. + +## Related resources + +### Account management +- [Password management](/user-docs/password-management) - Change and secure your password +- [Delete your Baserow account](/user-docs/delete-your-baserow-account) - Permanent account removal +- [Database tokens](/user-docs/personal-api-tokens) - API authentication +- [Notifications](/user-docs/notifications) - Configure email alerts + +### Workspace settings +- [Set up a workspace](/user-docs/setting-up-a-workspace) - Create and configure workspaces +- [Manage workspace members](/user-docs/manage-workspace-permissions) - Add and remove members +- [Workspace permissions](/user-docs/permissions-overview) - Role-based access control + +### Security +- [Password management](/user-docs/password-management) - Account security best practices +- [Single Sign-On](/user-docs/single-sign-on-sso-overview) - Enterprise authentication (Enterprise) + +### API and integrations +- [Database API](/user-docs/database-api) - REST API documentation +- [Webhooks](/user-docs/webhooks) - Event-driven integrations +- [Zapier integration](/user-docs/zapier) - Connect thousands of apps + +--- + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow.io/user-docs/password-management + [2]: https://baserow.io/user-docs/notifications + [3]: https://baserow.io/user-docs/mcp-server + [4]: https://baserow.io/user-docs/personal-api-tokens + [5]: https://baserow.io/user-docs/delete-your-baserow-account + [6]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/52bd0673-997c-4040-ac22-d224f85d2611/Account%20settings.jpg + [7]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/156ab688-8e3d-4fde-aa9c-a91dd2c92ef5/2FA.jpg",,baserow_user_docs,https://baserow.io/user-docs/account-settings-overview +22,Manage password,password-management,Baserow password management guide for users,"# Password management + +Your password secures your Baserow account and should be strong, unique, and changed periodically for security. + +This guide covers how to set, change, and reset your Baserow account password, including password requirements and recovery procedures. + +![Baserow Account settings image][1] + + +Learn more: [Access account settings][2] + + +## Password requirements + +Baserow requires passwords with a **minimum of 8 characters** when creating new accounts or changing existing passwords. + +**Password best practices:** +- Use at least 12 characters (longer is stronger) +- Combine uppercase, lowercase, numbers, and symbols +- Avoid common words or personal information +- Use a unique password (don't reuse from other sites) +- Consider using a password manager + +## Set your initial password + +When creating a new Baserow account, you'll set your password during the signup process. + +1. Enter your email address +2. Create a password (minimum 8 characters) +3. Confirm your password +4. Complete account creation + +Once set, use your email and password to log in to Baserow. + +## Change your password + +Update your password from account settings at any time. Your account settings are accessible from any page in Baserow. + +Change your password if you suspect unauthorized account access, your password was exposed in a data breach elsewhere, you used the same password on multiple sites, it's been over 6 months since your last change, or you're sharing devices and want to secure your account + +### How to change password + +1. Click your **workspace icon** or **workspace name** in the top-right corner +2. Select **My settings** from the dropdown menu. The account settings page opens with tabs for each setting category. +3. Click the **Password** tab +4. Enter your **old password** +5. Enter your **new password** +6. **Repeat your new password** to confirm +7. Click **Change password** + +Your new password takes effect immediately. You'll remain logged in on your current device, but will need the new password on other devices. The next time you want to log in, you have to use your new password. + +## Reset forgotten password + +Recover account access if you've forgotten your password. + +### How to reset password + +1. Go to the [Baserow login page](https://baserow.io/login) +2. Click **Forgot password?** +3. Enter your **email address** +4. Click **Send reset link** +5. Check your email for the reset link +6. Click the link in the email +7. Enter your **new password** +8. Confirm the password +9. Click **Reset password** + +The reset link expires after 24 hours. Request a new one if it expires before you use it. + +### Local Docker instances without email + +If you're running Baserow locally with Docker and haven't configured email, password reset links appear in your container logs instead of email. + +**Find the reset link in logs:** + +1. Submit the forgot password form with your email +2. Check your Docker container logs: `docker logs [container_name]` +3. Search for ""reset-password"" in the logs +4. Copy the complete URL from the logs +5. Paste the URL into your browser +6. Create your new password and log in + +**Quick search commands:** + +**Linux/Mac:** +```bash +docker logs [container_name] | grep ""reset-password"" +``` + +**Windows CMD:** +```cmd +docker logs [container_name] | findstr ""reset-password"" +``` + +**Windows PowerShell:** +```powershell +docker logs [container_name] | Select-String ""reset-password"" +``` + +Replace `[container_name]` with your actual Baserow container name (e.g., `baserow`, `baserow-1`). + +## Frequently asked questions + +### What if I don't receive the password reset email? + +Check your spam/junk folder first. If it's not there, verify you entered the correct email address. The system only sends reset emails to registered accounts. Wait a few minutes and try again, or [contact support](/contact) if issues persist. + +### Can workspace admins reset my password? + +No. Workspace administrators cannot access or reset other users' passwords. Password resets must be initiated by the account owner through the forgot password form. This protects account security and privacy. + +### How long does the password reset link last? + +Password reset links expire after **24 hours** for security. If your link expires, request a new reset link through the forgot password form. You can request new links as many times as needed. + +### Will changing my password log me out of other devices? + +No, changing your password doesn't automatically log you out of other devices or browser sessions. If you suspect unauthorized access, change your password, then manually log out of all devices by visiting Baserow on each device and logging out. + +### Can I use the same password I used before? + +While Baserow allows password reuse, it's not recommended for security. Use a new, unique password each time you change it. Password managers can help generate and remember strong, unique passwords. + +## Security tips + +**Enable two-factor authentication** (when available): Add an extra security layer beyond just your password. + +**Use unique passwords**: Don't reuse your Baserow password on other websites or services. + +**Update regularly**: Change your password every 6-12 months, or immediately if you suspect compromise. + +**Secure password storage**: Use a password manager instead of writing passwords down or storing them in plain text files. + +**Watch for phishing**: Baserow will never ask for your password via email. Only enter your password on official Baserow login pages. + +**Avoid public WiFi for login**: Use secure networks when accessing Baserow, especially when entering your password. + +## Related resources + +### Account security +- [Account settings overview](/user-docs/account-settings-overview) - Manage your account +- [Single Sign-On (SSO)](/user-docs/single-sign-on-sso-overview) - Enterprise authentication (Enterprise) +- [Delete your account](/user-docs/delete-your-baserow-account) - Account removal + +### Workspace access +- [Permissions overview](/user-docs/permissions-overview) - Role-based access control +- [Manage workspace members](/user-docs/manage-workspace-permissions) - Add and remove members + +### Getting started +- [How to get started with Baserow](/user-docs/how-to-get-started-with-baserow) - New user guide +- [Baserow basics](/user-docs/baserow-basics) - Core concepts + +--- + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/52bd0673-997c-4040-ac22-d224f85d2611/Account%20settings.jpg + [2]: https://baserow.io/user-docs/account-settings-overview",,baserow_user_docs,https://baserow.io/user-docs/password-management +23,Delete and recover data,data-recovery-and-deletion,Delete and recover Baserow data,"# Delete and recover data + +Baserow protects against accidental data loss with multiple recovery options. Deleted items move to trash for 3 days before permanent deletion, and recent changes can be undone instantly. + +This guide covers how to recover accidentally deleted workspaces, databases, tables, fields, and rows using Baserow's trash system, undo/redo functions, and restoration features. + +## How data recovery works in Baserow + +Baserow provides multiple safety nets to prevent permanent data loss. Deleted items don't disappear immediately; they're recoverable through trash (3-day retention), undo/redo (recent actions), and change history (audit trail). Understanding these recovery methods helps you restore data quickly when mistakes happen. + +**Recovery options:** + - **Trash** - 3-day retention for deleted workspaces, databases, tables, fields, and views + - **Undo/Redo** - Instant reversal of recent actions like cell edits or row deletions + - **Restore popup** - 7-second quick recovery notification after deletions + - **[Row change history][1]**: Track row updates + - **Change history** - Audit log showing who changed what and when (Enterprise) + + + +## What can be recovered + +Different types of deletions have different recovery options: + +| Item deleted | Trash recovery | Undo/Redo | Retention period | +|--------------|----------------|-----------|------------------| +| **Workspace** | ✓ | ✓ | 3 days | +| **Database** | ✓ | ✓ | 3 days | +| **Table** | ✓ | ✓ | 3 days | +| **View** | ✓ | ✓ | 3 days | +| **Field** | ✓ | ✓ | 3 days | +| **Row** | ✓ | ✓ | 3 days | +| **Cell value** | – | ✓ | Until session ends | + +> Individual cell deletions don't go to trash; they can only be recovered via undo/redo immediately after deletion. You can track updates in [row history][1]. + +## Undo and redo actions + +Instantly reverse recent changes using Baserow's undo/redo system. This works for cell edits, row deletions, field modifications, and most table operations. + +### How to undo/redo + +**Keyboard shortcuts** (fastest method): +- **Undo:** `Cmd/Ctrl + Z` +- **Redo:** `Cmd/Ctrl + Shift + Z` + +**Toolbar buttons:** +- Click the **undo/redo icons** in the bottom-left corner +- Undo reverses the most recent action +- Redo re-applies actions you've undone + +![Undo and redo buttons in Baserow](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/fd9bd0c2cbd5d68145edbd33aa54ee39080b252d.webp) + +### Quick restore popup + +When you delete a workspace, table, row, or make significant changes, a **""Restore deleted""** popup appears at the bottom of the screen for ~7 seconds. Click **Undo** in this popup to immediately reverse the deletion. + +This quick restore is particularly useful for accidental deletions you notice immediately. + +### What undo/redo covers + +**Undo works for:** +- Cell value changes +- Row additions and deletions +- Field creations, modifications, and deletions +- View creations and deletions +- Table operations +- Database and workspace deletions + +**Undo limitations:** +- Undo history clears when you close the browser tab +- Some bulk operations may not be fully reversible +- Imports and exports typically can't be undone +- Changes by other users don't appear in your undo history + +## Access the trash + +The trash stores deleted workspaces, databases, tables, views, and fields for 3 days before permanent deletion. + +### Open trash + +1. Click **Trash** in the sidebar under Dashboard on the home screen +2. The trash displays all deleted items from the past 3 days +3. Items show **what** was deleted, **where** from, **when**, and **who** deleted it + +![Baserow trash interface][2] + +### Trash organization + +Trash items are organized by workspace. Navigate through workspaces to find deleted databases, tables, views, or fields within each workspace. + +**Trash displays:** +- Deletion timestamp (date and time) +- Item type (workspace, database, table, view, field) +- Original location before deletion +- User who performed the deletion +- Days remaining before permanent deletion + +## Recover deleted items + +Restore items from trash back to their original locations or choose new locations. + +### Restore from trash + +1. Click **Trash** in the sidebar +2. **Navigate** to the item you want to restore +3. Click **Restore** next to the deleted item +4. The item returns to its original location immediately + +Restored items include all their contents: +- **Workspaces** restore with all databases, tables, and data +- **Databases** restore with all tables, views, and fields +- **Tables** restore with all rows, fields, and views +- **Views** restore with all configuration and filters +- **Fields** restore with all column data + +### Who can restore items + +**Workspace admins** can restore any deleted items from their workspaces, including workspaces, databases, tables, views, and fields. + +**Members with appropriate permissions** can restore items within databases or tables they have access to, but cannot restore entire workspaces or databases. + +Learn more: [Permissions overview](/user-docs/permissions-overview) + +### Restore limitations + +**After 3 days:** Items are permanently deleted and cannot be recovered through trash or any other method. Export important data regularly for long-term backup. + +**Cell value changes:** Modified cell values don't go to trash; use undo/redo to reverse changes or check change history if available. + +## Permanently delete from trash + +Empty trash to permanently delete items before the 3-day retention period expires. This action cannot be undone. + +### Empty trash options + +**Delete individual items:** +1. Open **Trash** +2. Navigate to the item +3. Click **Delete permanently** next to the item +4. Confirm the permanent deletion + +**Empty entire workspace trash:** +1. Open **Trash** +2. Navigate to the workspace +3. Click **Empty this workspace's trash** +4. Confirm to permanently delete all items in that workspace's trash + +> **Warning:** Permanently deleted items cannot be recovered by Baserow support or through any technical means. Ensure you don't need the data before emptying the trash. + +### When to empty trash + +**Free up storage:** Deleted items count toward storage limits until permanently removed. + +**Remove sensitive data:** Ensure confidential information is truly deleted by emptying trash. + +**Clean up mistakes:** Permanently remove test data or unwanted items created by error. + +**Before workspace handoff:** Clear trash before transferring workspace ownership to prevent new owners from restoring old data. + +## Deletion workflows by item type + +### How to delete different items + +**[Delete a workspace](/user-docs/delete-a-workspace)** - Must be workspace admin. Deletes all databases, tables, and data within the workspace. + +**[Delete a database](/user-docs/delete-a-database)** - Requires database permissions. Deletes all tables, views, and fields within the database. + +**[Delete a table](/user-docs/delete-a-table)** - Requires table permissions. Deletes all rows, fields, and views within the table. + +**[Delete a view](/user-docs/view-customization#delete-a-view)** - Deletes view configuration but not underlying table data. + +**[Delete a field](/user-docs/field-customization#delete-field)** - Permanently removes the field and all data in that column. + +## Frequently asked questions + +### What happens after the 3-day trash retention period? + +Items are permanently deleted from Baserow servers and cannot be recovered through any means, including by Baserow support. The 3-day period is absolute; there's no extension or grace period beyond this. Export important data before deletion or regularly for backup purposes. + +### Can workspace admins see who deleted items? + +Yes. The trash displays the username of who deleted each item along with the deletion timestamp. This audit trail helps track accidental deletions and identify training needs. + +### Does trash count toward my storage limit? + +Yes. Items in trash count toward workspace storage limits until permanently deleted or until the 3-day retention period expires. If you're approaching storage limits, consider emptying trash to free up space. + +### Can I restore individual fields from a deleted table? + +Yes, but you must restore the entire table first. Once the table is restored, you can then work with individual fields. You cannot restore individual fields without restoring their parent table. + +### What happens to linked data when I restore items? + +[Link-to-table fields](/user-docs/link-to-table-field) and relationships restore correctly when you recover items. If you deleted and restored both linked tables, connections re-establish automatically. If one linked table was permanently deleted, the link fields become empty. + +### Can I undo actions by other users? + +No. Undo/redo only works for your own actions in your current browser session. You cannot undo changes made by other workspace members. Workspace admins can use trash to restore items deleted by others or check [change history](/user-docs/row-change-history) to see who made what changes. + +### Is there a way to back up data beyond the 3-day period? + +Yes. [Export tables](/user-docs/export-tables), [export views](/user-docs/export-a-view), or [export entire workspaces](/user-docs/export-workspaces) regularly to create backups. For automated backup solutions, consider using the [Baserow API](/user-docs/database-api) or [webhooks](/user-docs/webhooks) with external backup systems. + +## Related resources + +### Deletion guides +- [Delete a workspace](/user-docs/delete-a-workspace) - Workspace deletion and requirements +- [Delete a database](/user-docs/delete-a-database) - Database removal process +- [Delete a table](/user-docs/delete-a-table) - Table deletion steps +- [Delete a view](/user-docs/view-customization#delete-a-view) - View removal +- [Delete a field](/user-docs/field-customization#delete-field) - Field deletion + +### Data management +- [Export tables](/user-docs/export-tables) - Download table backups +- [Export views](/user-docs/export-a-view) - Export filtered data +- [Export workspaces](/user-docs/export-workspaces) - Complete workspace backups +- [Import data](/user-docs/import-data-into-an-existing-table) - Restore exported data + +### Access control +- [Permissions overview](/user-docs/permissions-overview) - Who can delete and restore +- [Manage workspace members](/user-docs/manage-workspace-permissions) - Control access levels + +### Audit and tracking +- [Row change history](/user-docs/row-change-history) - Track data modifications +- [Notifications](/user-docs/notifications) - Get alerts for workspace changes + +### Advanced features +- [Database API](/user-docs/database-api) - Programmatic backups +- [Webhooks](/user-docs/webhooks) - Automate backup workflows +- [Snapshots](/user-docs/snapshots) - Point-in-time backups (Enterprise) + +--- + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow.io/user-docs/row-change-history + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/e16b8f4c-2dc8-429c-85e1-b1b17d31554d/Restore%20deleted%20items%20from%20the%20past%203%20days.jpg",,baserow_user_docs,https://baserow.io/user-docs/data-recovery-and-deletion +24,Tables overview,intro-to-tables,Manage your data in Baserow tables,"# Introduction to tables in Baserow + +Tables are where your data lives in Baserow. Baserow tables combine spreadsheet familiarity with database power; organize once, visualize many ways. + + + +![Views in Baserow image][1] + +## Overview + +A Baserow table stores and organizes your data in rows (records) and columns (fields). While tables function like spreadsheets with sorting, filtering, and aggregation capabilities, they go further by displaying the same data in multiple ways; grid, gallery, form, calendar, or kanban. + +Tables live inside databases, which live inside workspaces, giving you a clear hierarchy for organizing projects and data. + + + + + +## What makes Baserow tables powerful + +Like spreadsheet tabs, tables organize information into rows and columns, while offering multiple views, powerful filtering, and relationship capabilities that spreadsheets can't match. + +| Feature | Traditional spreadsheets | Baserow tables | +|---------|-------------------------|----------------| +| **Data organization** | Single view per sheet | 5+ view types per table | +| **Field types** | Generic text/numbers | 25+ specialized fields | +| **Relationships** | Manual lookup formulas | Built-in table linking | +| **Collaboration** | File conflicts | Real-time editing | +| **Data validation** | Basic rules | Field-specific validation | +| **Customization** | Limited formatting | Row colors, field configs | + + +## How tables work in Baserow + +### Hierarchy structure + +To organize with multiple tables, store related but distinct information in separate tables within the same database. For example, a sales database might include: + +``` +Workspace (Your company/team) +└── Database (Project or department) + ├── Table 1 (Customers – Contact information and company details) + ├── Table 2 (Orders – Purchase records linked to customers) + └── Table 3 (Products – Inventory and pricing information) + └── Table 4 (Invoices – Billing documents linked to orders) +``` + +**Tables contain:** +- **Rows (records):** Individual entries like a customer, order, or task +- **Fields (columns):** Categories of information like name, date, or status +- **Views:** Different ways to visualize and interact with the data +- **Filters and sorts:** Customize what data appears and in what order + +> Use [Link to table fields](/user-docs/link-to-table-field) to connect related information across tables; like linking orders to customers or tasks to projects. + +### Multiple views, same data + +Tables can be visualized in different ways without duplicating information: + - **[Grid view](/user-docs/guide-to-grid-view)** – Classic spreadsheet layout for detailed editing + - **[Gallery view](/user-docs/guide-to-gallery-view)** – Visual cards perfect for images and media + - **[Form view](/user-docs/guide-to-creating-forms-in-baserow)** – Collect data from external users + - **[Calendar view](/user-docs/guide-to-calendar-view)** – Timeline visualization for dates and events + - **[Kanban view](/user-docs/guide-to-kanban-view)** – Drag-and-drop workflow management + - [Timeline view][2] + + +## Common use cases + +### Business operations +- **CRM & Sales:** Customer databases, deal pipelines, contact management +- **Project Management:** Task trackers, sprint planning, team assignments +- **Inventory:** Product catalogs, stock levels, supplier information +- **HR:** Employee directories, applicant tracking, onboarding workflows + +### Teams & collaboration +- **[Team Check-ins](https://baserow.io/templates/team-check-ins)** – Track team feedback, suggestions, and project updates +- **[Product Roadmap](https://baserow.io/templates/product-roadmap)** – Communicate priorities and strategic plans to stakeholders + +### Specialized workflows +- **[Commercial Property Management](https://baserow.io/templates/commercial-property-management)** – Tenant requests, lease tracking, vendor contacts +- **[Wedding Client Planner](https://baserow.io/templates/wedding-client-planner)** – Vendor coordination, budget tracking, event details +- **[Nonprofit Grant Tracker](https://baserow.io/templates/nonprofit-grant-tracker)** – Grant deadlines, eligibility, application statuses + +Browse 50+ table templates in the [template library](/user-docs/add-database-from-template) or [import from spreadsheets](/user-docs/create-a-table-via-import). + + +## What you can do with tables + +**Data management:** +- Create unlimited rows (records) and fields (columns) +- [Import from CSV, Excel, JSON, or XML](/user-docs/create-a-table-via-import) +- [Export data](/user-docs/export-tables) for backups or external use +- Bulk edit multiple rows simultaneously + +**Organization and filtering:** +- [Sort by any field](/user-docs/view-customization) (alphabetically, numerically, by date) +- [Filter data](/user-docs/filters-in-baserow) with complex conditions +- [Group rows](/user-docs/group-rows-in-baserow) by categories +- [Color-code rows](/user-docs/row-coloring) for visual organization + +**Customization:** +- Choose from 25+ [field types](/user-docs/baserow-field-overview) (text, numbers, dates, files, formulas) +- Configure field properties and validation rules +- Adjust [table settings](/user-docs/customize-a-table) like row height and appearance +- Create [personal views](/user-docs/personal-views) for individual workflows + +**Collaboration:** +- Real-time editing with team members +- [Row comments](/user-docs/row-commenting) and @mentions +- [Track changes](/user-docs/row-change-history) to see who edited what +- Set [permissions](/user-docs/permissions-overview) to control access + + + +## Frequently asked questions + +### What's the difference between a database and a table? + +A database is a container that holds multiple related tables. For example, a ""Sales Management"" database might contain ""Customers,"" ""Orders,"" and ""Products"" tables. This hierarchy keeps related data organized in one place. + +### How many tables can I create in a database? + +There's no hard limit on the number of tables per database. However, keeping tables well-organized improves performance and usability. Most databases work best with 5-15 tables. If you need more, consider splitting into multiple databases or consolidating similar data. + +### Can I link data between tables? + +Yes, this is one of Baserow's most powerful features. Use [Link to table fields](/user-docs/link-to-table-field) to create relationships between tables, like linking orders to customers or tasks to projects. Once linked, you can use [lookup fields](/user-docs/lookup-field) to display related information and [rollup fields](/user-docs/rollup-field) to calculate across relationships. + +### How are tables different from views? + +A table stores your actual data (rows and fields). A view is a way to display that data with specific filters, sorts, or visualizations. One table can have multiple views, like a Grid view for editing and a Kanban view for workflow management; all showing the same underlying data. + +### Can I convert a spreadsheet into a Baserow table? + +Yes, [import CSV or Excel files](/user-docs/create-a-table-via-import) directly into Baserow. The import process automatically detects column types and converts them to appropriate field types. After import, you can refine field configurations and add Baserow-specific features like formulas and relationships. + +--- + +## Related content + +- **[Create a table](/user-docs/create-a-table)** – Build tables from scratch or import data +- **[Create a table via import](/user-docs/create-a-table-via-import)** – Convert spreadsheets to Baserow tables +- **[Field overview](/user-docs/baserow-field-overview)** – Learn about available field types +- **[Table configuration](/user-docs/customize-a-table)** – Customize appearance and behavior + +**Advanced features:** +- **[Link to table field](/user-docs/link-to-table-field)** – Connect related tables +- **[View customization](/user-docs/view-customization)** – Sort and filter your data +- **[Export tables](/user-docs/export-tables)** – Download data for external use +- **[Delete a table](/user-docs/delete-a-table)** – Remove tables you no longer need + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account. + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/e9bc258a-093b-4993-b351-9f81fa2ebd18/views%20in%20baserow.png + [2]: https://baserow.io/user-docs/guide-to-timeline-view",,baserow_user_docs,https://baserow.io/user-docs/intro-to-tables +25,Export a table,export-tables,Export a table from Baserow,"# Export tables from Baserow + +Exports preserve your data structure and content but exclude certain elements like row comments and revision history. + +Download table data in CSV, Excel, JSON, or XML format for backups, external analysis, or sharing. Export entire tables or specific views with all visible data and configurations. + + +## Overview + +Exporting creates downloadable copies of your table data in formats compatible with spreadsheet applications, databases, and analysis tools. You can export entire tables with all data or specific views that contain only filtered and sorted subsets. Exports capture the current state of your data, making them perfect for backups, reporting, or transferring information. + + +![Exporting to Excel format](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/34c782a5-9d60-4307-b646-033a875a9b02/excel_export.webp) + +## What gets exported + +**Included in exports:** All field values in visible rows, field names as column headers, row order based on current sorting, and data formatted according to field types (dates, numbers, text, etc.). + +**Excluded from exports:** [Row comments and mentions](/user-docs/row-commenting) don't export since they're metadata about rows rather than row data. [Row revision history](/user-docs/row-change-history) and audit logs also stay in Baserow. Collaborator information and user assignments are excluded, though the data in collaborator fields exports as names or emails. + +**Filter behavior:** View exports respect active filters in your current view. If you've filtered to show only rows where Status equals ""Active,"" your export contains only those active rows. This is powerful for creating targeted reports, but it can accidentally exclude data if you forget about active filters. Remove all filters before exporting if you need complete table data. + + + +## Choosing an export format + +Each format serves different purposes and works best with specific tools or workflows. + + - **Export files** creates a downloadable archive containing all files and images from file fields in your view, organized by row ID. Each row gets its own folder, making it easy to see which files belong to which records. This is useful when you need to extract attachments, images, or documents from your table for offline use, archival purposes, or sharing with people who don't need the structured data; just the files themselves. + - **CSV (Comma-Separated Values)** is the universal format that opens in Excel, Google Sheets, and virtually any spreadsheet or database application. It's plain text, highly compatible, and works across all platforms. Use CSV for maximum compatibility, importing into other databases or systems, and when file size matters, since it's the most compact format. CSV is ideal for data that doesn't require formatting preservation. + - **Excel (.XLSX)** maintains formatting, supports multiple sheets, and works natively with Microsoft Excel. It preserves cell formatting better than CSV and supports Excel-specific features. Choose Excel when recipients primarily use Microsoft Office, you need to preserve number and date formatting precisely, or you're creating reports that require visual formatting. Excel files are larger than CSV but provide richer formatting. + - **JSON (JavaScript Object Notation)** creates structured data files perfect for developers and programmatic use. It preserves data types explicitly and works seamlessly with web applications and APIs. Use JSON for data integration with web applications, API development and testing, or when you need machine-readable structured data. JSON is the best choice for technical users building integrations. + - **XML (Extensible Markup Language)** provides hierarchical structured data often required by enterprise systems and technical workflows. It's more verbose than JSON but necessary for specific integration requirements. Choose XML when integrating with enterprise systems that require XML format, working with legacy systems, or meeting specific technical specifications. XML is less common for everyday use but critical for certain integrations. + + +## How to export tables + +### Export entire tables + +Exporting the full table captures all data regardless of current filters or views, giving you a complete backup or dataset. + +1. **Click the `⋮` icon** next to the table name in your sidebar +2. Select **Export table** from the menu +3. Choose **Export entire table** from the dialog +4. **Select your format** (CSV, Excel, JSON, files, or XML) +5. Download the file to your device's default download folder + +The export includes every row and field in the table with current values as of the export moment. + +### Export specific views + +Exporting views captures only the data visible in that view, including applied filters, sorts, and field visibility settings. This is perfect for creating targeted reports or sharing specific subsets of data. + +Learn more about views: [Export views](/user-docs/export-a-view) + + + +## Export strategies for common scenarios + +**Regular backups:** Export entire tables as CSV or Excel monthly or weekly, depending on data change frequency. Store exports in cloud storage or backup systems for disaster recovery. Consider automating exports through the API for critical tables. + +**Sharing with external stakeholders:** Create filtered views showing only relevant data, then export those views to share specific information without exposing your entire database. Use Excel format for polished presentations or CSV for simple data sharing. + +**Data analysis in other tools:** Export to CSV for universal compatibility with analysis software, BI tools, or statistical packages. Remove filters to ensure you're analyzing complete datasets rather than subsets. + +**Migration or archiving:** Use JSON format for complete data structure preservation when moving data between systems or creating archives. JSON maintains data types more reliably than CSV for later re-import. + +**Periodic reporting:** Set up views with specific filters and sorts that generate your standard reports, then export those views on a schedule (weekly sales reports, monthly inventories, etc.). The same view exported at different times creates consistent report formats with updated data. + + + +## Frequently asked questions + +### What happens to linked table data in exports? + +Link to table fields export as references showing linked record IDs or primary field values. The actual data from linked tables doesn't export automatically. If you need complete information from multiple linked tables, export each table separately and use IDs to match records in your analysis tool. + +### Can I export multiple tables at once? + +No, Baserow exports one table at a time. To export multiple tables, repeat the export process for each one. For complete database backups including multiple tables, consider using the [database or workspace export feature](/user-docs/export-workspaces), which bundles all tables together. + +### Do formula fields export calculated values or formulas? + +Formula fields export their calculated values, not the formulas themselves. If a formula calculates ""15"" based on other fields, the export contains ""15"" as static data. The export doesn't preserve the formula logic or update automatically if the source data changes. + +### How large can exported files be? + +Export size depends on your data volume and format. CSV files are the most compact, while Excel and XML are larger. Very large tables (tens of thousands of rows) may take several minutes to export and result in large files. Consider filtering exports or splitting large tables if the file size becomes problematic. + +### Can I automate regular exports? + +Manual exports work well for occasional needs, but frequent exports benefit from automation. Use the [Baserow API](/user-docs/database-api) to programmatically trigger exports on schedules. This is particularly useful for daily or weekly backups, regular reporting, or integration with external backup systems. + + + +## Related content + +**Work with exported data:** +- **[Import data](/user-docs/create-a-table-via-import)** – Bring external data back into Baserow +- **[Import into existing tables](/user-docs/import-data-into-an-existing-table)** – Add exported data to tables + +**Related table operations:** +- **[Create views](/user-docs/create-custom-views-of-your-data)** – Set up views for targeted exports +- **[Filter and sort](/user-docs/filters-in-baserow)** – Control what data exports contain +- **[Table configuration](/user-docs/customize-a-table)** – Other table management options + +**Alternative approaches:** +- **[Workspace export](/user-docs/export-workspaces)** – Export entire databases at once +- **[Database API](/user-docs/database-api)** – Programmatic data access and export + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account.",,baserow_user_docs,https://baserow.io/user-docs/export-tables +26,Configure table options,customize-a-table,Configure and customize tables in Baserow,"# Table configuration and customization + +Table settings let you organize, secure, and automate your data without changing the actual content or structure. + +Customize table behavior, appearance, and organization with renaming, reordering, webhooks, permissions, and export options. Access all settings through the table menu in your sidebar. + + + + + +## Overview + +Table configuration controls how your tables behave, who can access them, and how they integrate with other systems. Unlike field-level settings that affect individual columns, table settings apply to the entire table and its data. + +You'll find these options in the three-dot menu (`⋮`) next to each table name in your sidebar. + + +## Accessing table settings + +All table configuration options are available through the table menu. + +Click the three-dot icon (`⋮`) next to any table name in the sidebar to reveal options including rename, duplicate, delete, export, webhooks, and permissions management. + +Some settings, like reordering, work directly through drag-and-drop in the sidebar without opening a menu. + + + +## Organizing your tables + +### Rename tables + +Give tables clear, descriptive names that indicate their purpose and content. This becomes especially important in databases with multiple similar tables where generic names like ""Table 1"" create confusion. Good naming helps team members quickly identify the right table and makes references in documentation more meaningful. + +To rename a table: + +1. Click the `⋮` icon next to the table name in the sidebar +2. Select ""Rename,"" and enter your new name. + +Table names can be changed anytime without affecting data, views, or relationships with other tables. + + + +### Reorder tables in sidebar + +Arrange tables in the order that matches your workflow by dragging and dropping them in the sidebar. Position frequently used tables at the top for quick access, group related tables together for logical organization, and separate active projects from archived data. + +Click and hold on a table name, then drag it to your desired position and release. + + +## Table operations + +### Duplicate tables + +Duplicating creates an exact copy of a table's structure and data, perfect for creating templates, testing changes without affecting the original, or setting up similar tables for different teams or time periods. + +Access this option from the table menu (`⋮`), and the duplicate appears immediately below the original. + +Duplication copies all fields, data, views, filters, sorts, and formulas. However, it doesn't copy row comments, revision history, or webhook configurations. After duplicating, customize the copy as needed without affecting the original table. + +Learn more: [Duplicate a table](/user-docs/create-a-table#duplicate-a-table) + +### Delete tables + +Remove tables you no longer need to keep your database organized and reduce clutter. Deleted tables move to the trash with a recovery window before permanent deletion. + +Access deletion through the table menu (`⋮`), confirm your choice, and use the 5-second undo window if you change your mind immediately. + +> Deleting a table removes it for all collaborators, not just you. If the table contains data others need, consider exporting it first or checking with your team before deleting. + +Learn more: [Delete a table](/user-docs/delete-a-table) + + + +## Data management features + +### Export tables + +Export table data for backups, analysis in external tools, or sharing with people outside Baserow. Available formats include CSV for universal compatibility with spreadsheet applications, and JSON for programmatic use and data integration. Access export options through the table menu or view settings. + +Learn more: [Export tables](/user-docs/export-tables) + +### Multiple cell paste + +Speed up data entry by copying and pasting multiple cells at once from spreadsheets or other sources. + +Select cells in Excel or Google Sheets, copy them with `Ctrl/Cmd + C`, click into your target cell in Baserow, and paste with `Ctrl/Cmd + V`. Baserow intelligently maps pasted data to your table structure, filling cells in the same pattern as your copied selection. + + +This is useful for bulk updates, importing small datasets without formal import procedures, and quickly filling in data from external sources. Pasted data respects field types; numbers go into number fields, dates into date fields, etc. + +Learn more: [Paste data into cells][1] + +## Automation and integration + +### Webhooks + +Webhooks send real-time notifications to external systems when data changes in your table. Use them to trigger automations when new rows are created, send alerts when specific fields are updated, sync data to external databases automatically, or connect Baserow with thousands of apps through platforms like Zapier or Make. + +Configure webhooks through the table menu by specifying the URL to notify, choosing which events trigger notifications (row created, updated, deleted), and optionally filtering which rows should trigger webhooks based on field values. Webhooks run automatically in the background, requiring no manual intervention once configured. + +Learn more: [Webhooks in Baserow](/user-docs/webhooks) + +### Date dependency + +Dependencies work across rows within the same table, helping maintain logical schedules without manual date adjustments. Configure relationships between rows where dates automatically adjust based on dependencies. This is useful for project management where task delays cascade through dependent activities. + +Learn more: Configure automated date relationships. Learn more about setting up [date dependency][2] + +![Views in Baserow image][5] + + + +## Access control + +### Table-level permissions + +Control who can view and edit specific tables within your database using table-level permissions. This allows you to share some tables with certain team members while restricting access to sensitive information in other tables within the same database. Permissions cascade from the workspace level, but table-level settings provide additional granularity. + +Learn more: [Assign roles at table level](/user-docs/assign-roles-at-table-level) + +## Frequently asked questions + +### Can I customize table settings for different views? + +Table settings apply to the entire table across all views. However, view-specific settings like filters, sorts, and field visibility are configured separately through [view customization](/user-docs/view-customization). Use views to create different perspectives on the same table data. + +### What happens to webhooks when I duplicate a table? + +Webhooks are not duplicated along with tables. After duplicating, you'll need to manually reconfigure webhooks for the new table if you want similar automation. This prevents accidental duplicate notifications to the same external systems. + +### Can I undo a table deletion? + +Yes, within 5 seconds of deletion, an undo button appears at the bottom-right of your screen. After that window, deleted tables move to the trash, where they can be recovered during the [grace period][4]. After the grace period, deletion becomes permanent and irreversible. + +### How do I prevent others from deleting or renaming my table? + +Use [table-level permissions](/user-docs/assign-roles-at-table-level) to control who can modify table settings. Assign viewer or editor roles to team members who should only work with data, and reserve admin roles for those who need full table configuration access. + + +## Related content + +**Table operations:** +- **[Create a table](/user-docs/create-a-table)** – Start with new blank or duplicated tables +- **[Delete a table](/user-docs/delete-a-table)** – Remove tables and recover from trash +- **[Export tables](/user-docs/export-tables)** – Download table data for external use + +**Advanced features:** +- **[Webhooks](/user-docs/webhooks)** – Automate notifications and integrations +- **[Table-level permissions](/user-docs/assign-roles-at-table-level)** – Control access granularly +- **[View customization](/user-docs/view-customization)** – Configure view-specific settings + +**Working with data:** +- **[Paste data into tables](/user-docs/paste-data-into-baserow-table)** – Quick data entry methods +- **[Import into existing tables](/user-docs/import-data-into-an-existing-table)** – Add bulk data +- **[Filter and sort](/user-docs/filters-in-baserow)** – Organize your table data + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account. + + + [1]: https://baserow.io/user-docs/paste-data-into-baserow-table + [2]: https://baserow.io/user-docs/date-dependency + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/3653c029-8fb7-4ab1-aace-8824cb43385b/date_dependency.png + [4]: https://baserow.io/user-docs/data-recovery-and-deletion + [5]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/e9bc258a-093b-4993-b351-9f81fa2ebd18/views%20in%20baserow.png",,baserow_user_docs,https://baserow.io/user-docs/customize-a-table +27,Delete a table,delete-a-table,How to delete a table in Baserow,"# Delete a table from your database + +Remove tables you no longer need from your database. Understand the trash recovery period, what gets deleted, and when to consider alternatives like archiving or exporting. + + + +## Overview + +Deleting a table removes it and all its contents from your database, making it inaccessible to everyone with database access. Baserow provides a grace period where deleted tables can be recovered from trash, but after that window closes, deletion becomes permanent and irreversible. + +This action affects not just the table itself but also any views, formulas in other tables that reference it, and linked relationships with other tables. + +> Table deletion is permanent after the [grace period](/user-docs/data-recovery-and-deletion). Always export or back up important data before deleting. + + +![Delete table option in sidebar menu](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/34c782a5-9d60-4307-b646-033a875a9b02/excel_export.webp) + + +## How to delete a table + +Deletion works through the table menu in your sidebar, giving you confirmation before the table is removed. + +### Step-by-step process + +1. **Locate the table** you want to delete in your database sidebar +2. **Click the `⋮` icon** next to the table name +3. Select **Delete** from the dropdown menu +4. **Confirm the deletion** in the dialog box that appears +5. **Watch for the undo notification** at the bottom-right corner (5-second window) + +The table disappears immediately from your sidebar and moves to the trash. You have a limited time to recover it from the trash before permanent deletion. + + + +## What gets deleted + +When you delete a table, Baserow removes comprehensive information beyond just the visible data. + +**Table contents deleted:** All rows and their data values, all fields and their configurations, all views including Grid, Gallery, Kanban, Calendar, and Timeline views, filters, sorts, and grouping configurations, row comments and revision history, and all uploaded files stored in file fields. + +**Database impacts:** Formulas in other tables that reference the deleted table will show errors. Link to table fields in other tables that are connected to the deleted table become broken and show empty values. Lookup and rollup fields that pulled data from the deleted table stop working. Webhooks configured for the deleted table are removed automatically. + +**What remains:** The database structure itself stays intact. Other tables in the same database are unaffected unless they have relationships with the deleted table. Database-level settings, permissions, and configurations persist. The table name becomes available for reuse on new tables. + + + +## Recovery options + +Baserow provides safety nets against accidental deletion, but they're time-sensitive. + +### Immediate undo (within 5 seconds) + +Right after deleting a table, a notification appears at the bottom-right corner with an ""Undo"" button. Click this button within 5 seconds to instantly restore the table as if deletion never happened. This is the fastest recovery method and prevents the table from entering trash entirely. The undo window is brief; watch for the notification immediately after confirming deletion. + +### Trash recovery + +If you miss the 5-second undo window, deleted tables remain in the trash for a limited time. During this grace period, you can restore them with all data, views, and configurations intact. + +After the [grace period](/user-docs/data-recovery-and-deletion), tables are permanently deleted from trash automatically. No recovery is possible after this point; data is completely erased from Baserow servers. + +Learn more: [Restore data from trash](/user-docs/data-recovery-and-deletion) + + + +## Before you delete: Consider alternatives + +Deletion is permanent after the [grace period](/user-docs/data-recovery-and-deletion), so consider whether other options better serve your needs. + +### Export then delete + +If you might need table data later but want to free up space or reduce clutter, export the table before deleting. This creates an offline backup you can reference or re-import if needed. Export formats include CSV for spreadsheet compatibility, Excel for formatted data, JSON for programmatic use, or XML for technical integrations. Store exports in cloud storage or backup systems for long-term access. + +Learn more: [Export tables](/user-docs/export-tables) + +### Duplicate for archival + +Create a duplicate of the table with ""(Archive)"" in the name, then move it to an archive database. This keeps historical data accessible in Baserow without cluttering your active workspace. You can restrict permissions on archived tables to prevent accidental editing while maintaining the ability to reference old information when needed. + +Learn more: [Duplicate tables](/user-docs/create-a-table#duplicate-a-table) + +### Hide instead of delete + +If the table isn't needed daily but contains reference information, keep it, but reorder it to the bottom of your sidebar. You can also create a separate ""Archive"" database and move old tables there. This keeps data accessible without permanent deletion while reducing visual clutter in your active workspace. + +### Clear data, keep structure + +If you want to reuse the table structure but start fresh with data, delete all rows instead of the entire table. This preserves your carefully configured fields, views, formulas, and relationships while clearing out old data. Use filters to select all rows, then bulk delete them, leaving an empty table ready for new data. + + + +## Delete vs. alternatives decision guide + +**Choose deletion when:** The table was created for testing or experimentation and is no longer needed, data is completely outdated and has no archival value, the table duplicates information better organized elsewhere, or you're certain no one will need this data again. + +**Consider alternatives when:** Data might be needed for reference or compliance, the table structure took significant time to configure, other tables link to this one, and you're unsure of the impact, or you're cleaning up but not certain about permanent removal. + +**Red flags suggesting alternatives:** Other team members might need access, formulas in other tables reference this table, the table contains historical data for reporting or audits, or you haven't verified whether linked tables will break. + + + + + +## Frequently asked questions + + + +### What happens to tables that link to the deleted table? + +Link to table fields that are connected to the deleted table become empty and show no linked records. Lookup fields that pull data from linked records stop working and display errors. Rollup fields that are calculated across relationships also break. Formulas referencing the deleted table show error messages. These broken references don't automatically fix themselves; you'll need to manually update affected tables. + +### Who can delete tables? + +Table deletion requires appropriate permissions. Workspace admins can always delete tables. Users with creator or admin roles at the table level can delete those specific tables. Members and viewers cannot delete tables even if they can access them. Check your [role-based permissions](/user-docs/permissions-overview) if you can't find the delete option. + +### Does deleting a table affect my storage quota? + +Yes, deleting tables frees up storage space, but the space isn't released until the table is permanently removed from trash after the grace period. While tables remain in trash during the grace period, they still count toward your storage quota. Once permanently deleted, all associated storage (row data and uploaded files) is freed. + +### Can I selectively delete data instead of the entire table? + +Yes, you can delete individual rows or groups of rows without removing the table. Use filters to select specific rows, then delete them in bulk. You can also delete individual fields (columns) without removing the table. Only use table deletion when you want to remove the entire structure and all its contents permanently. + + + +## Related content + +**Related table operations:** +- **[Create tables](/user-docs/create-a-table)** – Build new tables from scratch or duplicates +- **[Export tables](/user-docs/export-tables)** – Back up data before deletion +- **[Table configuration](/user-docs/customize-a-table)** – Other table management options + +**Data management:** +- **[Import data](/user-docs/create-a-table-via-import)** – Bring data back after accidental deletion +- **[Restore from trash](/user-docs/data-recovery-and-deletion)** – Recover deleted tables + +**Alternatives to deletion:** +- **[Duplicate tables](/user-docs/create-a-table#duplicate-a-table)** – Create archives instead of deleting +- **[Import into existing tables](/user-docs/import-data-into-an-existing-table)** – Transfer data before deletion + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account.",,baserow_user_docs,https://baserow.io/user-docs/delete-a-table +28,Baserow webhooks,webhooks,Baserow webhooks guide for automation,"# Baserow webhooks: Real-time notifications for data changes + +Baserow webhooks automatically notify external systems when your data changes. Webhooks eliminate manual data monitoring by sending instant notifications to any URL when your database changes occur. + +Set up webhooks to trigger actions when rows are created, updated, deleted, or when views and fields change - no manual checking required. + + + +## What are Baserow webhooks? + +Webhooks are automated notifications that Baserow sends to external applications whenever specific events happen in your database. Instead of constantly checking for changes, webhooks push updates to your systems in real-time. + +When you create, update, or delete data in Baserow, webhooks instantly notify your chosen endpoint with detailed information about what changed. This enables seamless integration with other tools, automated workflows, and real-time data synchronization. + +> For webhooks in Baserow Cloud, there is a maximum capacity of 5,000 pending calls per webhook. Any additional calls beyond this limit will be dropped. Please note that webhook calls are handled one at a time. + +## Webhook event types + +Baserow supports multiple webhook events to match different integration needs: + +### Row events +- **Rows created:** Triggers when new rows are added +- **Rows updated:** Triggers when existing rows are modified +- **Rows deleted:** Triggers when rows are removed + +### View events +- **View created:** Triggers when new views are added +- **View updated:** Triggers when view configurations change +- **View deleted:** Triggers when views are removed + +### Field events +- **Field created:** Triggers when new fields are added +- **Field updated:** Triggers when field properties change +- **Field deleted:** Triggers when fields are removed + +### Advanced events +- **Conditional row update:** Triggers only when specific field values change +- **Row enters view:** Triggers when rows match view filter conditions + +> If using deprecated webhook types (`row.created`, `row.updated`, `row.deleted`), migrate to the new batch types (`rows.created`, `rows.updated`, `rows.deleted`) for better performance. + +![Create a webhook in Baserow][1] + +## How to create a webhook + +1. **Access webhook settings** + - Click the ••• menu beside your table or view + - Select **Webhooks** + - Click **Create webhook +** + +2. **Configure basic settings** + - Enter a descriptive name for your webhook + - Choose HTTP method (GET, POST, PUT, PATCH, DELETE) + - Add your target URL endpoint + +3. **Select trigger events** + - Choose ""Send everything"" for all events + - Or select specific events you want to monitor + +4. **Add custom headers (optional)** + - Include authentication tokens + - Set content-type or other required headers + +5. **Test your webhook** + - Click **Trigger test webhook** + - Verify your endpoint receives the test payload + - Check the response in Baserow + +6. **Save and activate** + - Click **Save** to enable your webhook + - Test with real actions to confirm functionality + +## Webhook payload structure + +Baserow sends structured JSON payloads containing event details and affected data. + +Example payload for ""View Created"": + +```json +{ + ""table_id"": 50000, + ""database_id"": 1000, + ""workspace_id"": 300, + ""event_id"": ""00000000-0000-0000-0000-000000000000"", + ""event_type"": ""view.created"", + ""view"": { + ""id"": 0, + ""table_id"": 0, + ""name"": ""View"", + ""order"": 1, + ""type"": ""grid"", + ""table"": null, + ""filter_type"": ""AND"", + ""filters_disabled"": false, + ""public_view_has_password"": false, + ""show_logo"": true, + ""ownership_type"": ""collaborative"", + ""owned_by_id"": null, + ""row_identifier_type"": ""id"", + ""public"": false + } +} +``` + +**Key payload elements:** +- **Identifiers:** `table_id`, `database_id`, `workspace_id` specify the source +- **Event info:** `event_type` and `event_id` describe what happened +- **Data object:** Contains the full details of the affected item + +## Managing webhooks + +### Edit existing webhooks + 1. Access webhook settings via table ••• menu + 2. Click **details** on your webhook + 3. Select **Edit** view + 4. Modify settings as needed + 5. Click **Save** + +![Edit webhook in Baserow][2] + +### Monitor webhook activity +View webhook call logs to troubleshoot issues: +1. Go to webhook details +2. Select **Call log** view +3. Review request/response details for each call + +### Delete webhooks +In the webhook edit view, click **Delete** at the bottom. **Warning:** Deleted webhooks cannot be restored. + +## Error handling and reliability + +Baserow implements automatic retry logic for failed webhook calls: + +- **Retry attempts:** Limited number of retries for failed calls +- **Success criteria:** Endpoint must return `200 OK` status +- **Best practices:** Ensure your endpoint is reliable and can handle traffic spikes + +## Frequently asked questions + +### What happens if my webhook endpoint is down? +Baserow automatically retries failed webhook calls a limited number of times. Ensure your endpoint returns a `200 OK` status code and can handle temporary traffic spikes. + +### Can I filter which rows trigger webhooks? +Yes, use conditional row update webhooks to trigger only when specific field values change. You can also use view-based webhooks that only trigger for rows matching view filters. + +### How do I troubleshoot webhook failures? +Check the webhook call logs in Baserow to see request/response details. Common issues include wrong URLs, missing authentication headers, or endpoints not returning `200 OK` status codes. + +### Are there rate limits for webhooks? +Baserow doesn't impose strict rate limits, but ensure your receiving endpoint can handle the volume of changes in your database. Consider batching operations if you're making many simultaneous updates. + +### Can I use webhooks with external automation tools? +Yes, webhooks work seamlessly with Zapier, Make, n8n, and other automation platforms. Simply use the webhook URL provided by your automation tool as the endpoint. + +## Related content + +Based on the Baserow documentation structure, you might also find these topics helpful: + +- [Zapier integration](/user-docs/zapier) - Connect Baserow with 4000+ apps +- [Make integration](/user-docs/make) - Advanced automation workflows +- [n8n integration](/user-docs/n8n) - Open-source workflow automation +- [Database API documentation](/user-docs/database-api) - Direct API access +- [Database tokens](/user-docs/personal-api-tokens) - Authentication for integrations + +## Tutorials + + - [How to create a real-time notification system with Baserow webhooks][3] + - [How to set up webhooks in Baserow for real-time data updates][4] + - [How to set up a webhook to trigger on specific field changes][5] + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/cbc3a9de-a9d8-4a43-8eb9-e14f7a0a9c0c/Configure%20webhook.jpg + [2]: https://baserow-media.ams3.digitaloceanspaces.com/pagedown-uploads/2155abed-e5f5-4b86-aaa7-7c1f6e74d3bb/Screenshot%202022-08-10%20at%2021.19.02.png + [3]: https://baserow.io/blog/create-notification-system-using-webhooks + [4]: https://baserow.io/blog/webhooks-real-time-data-updates + [5]: https://baserow.io/blog/webhook-trigger-field-changes",,baserow_user_docs,https://baserow.io/user-docs/webhooks +29,Configure field types,field-customization,Baserow field configuration options,"# Field configuration options + +Field configuration in Baserow transforms basic columns into powerful data tools; letting you control appearance, behavior, and organization to match your workflow without rebuilding your entire table structure. + +This guide explains how to customize fields after creation, including editing field types, reordering, sorting, filtering, hiding, and deleting fields to optimize your table structure. + +For a comprehensive overview of available field types and their initial setup, see the [fields overview guide][1]. For information about adding new fields, consult the [field creation guide][2]. + +![Field configuration menu in Baserow](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/d0aeed55-5b39-4a09-9701-7b24b6c826c4/Fields%20option%20in%20Baserow.jpg) + +## Overview + +After creating fields, you can customize their type, appearance, behavior, and organization through the field configuration menu. These options let you refine your database structure as requirements evolve without losing data or starting over. + +Field configuration operates independently per view; hide fields in one view without affecting others, apply different sorts, or create view-specific filters while maintaining a single source of data truth. This flexibility enables you to create specialized views for different teams, workflows, or purposes from one table. + + + +> [Field-level permissions][3] provide granular control over who can edit specific fields in your tables. This enterprise-grade feature is available for paid users as part of Role-Based Access Control (RBAC). + +## Field configuration menu + +Access all field customization options through the field dropdown menu: + +**To open field configuration:** + +1. Locate the field you want to configure +2. Click the **dropdown arrow** next to the field name +3. Select your desired option from the menu + +Available options vary by field type; computed fields like formulas have different configuration options than manual entry fields like text or numbers. + +> **Primary field limitations:** The [Primary field][4] has restricted configuration options. You cannot delete, hide, or insert fields to its left, though you can edit its type and other properties. + +## Field configuration options overview + +| Configuration | Purpose | Affects data | Affects views | +|---------------|---------|--------------|---------------| +| **Edit field** | Change type, name, or settings | May transform data | All views | +| **Edit field permissions** | Control over who can edit the field | No | All views | +| **Insert** | Add new field next to current | No | All views | +| **Duplicate** | Create copy of field | No (unless copying data) | All views | +| **Filter** | Show/hide rows based on criteria | No | Current view only | +| **Sort** | Arrange rows by field values | No | Current view only | +| **Hide** | Remove field from view | No | Current view only | +| **Delete** | Remove field permanently | Yes, deletes data | All views | +| **Group** | Organize rows into sections | No | Current view only | +| **Reorder** | Change field position | No | Current view only | + +## Core field operations + +### How to edit a field + +Modify field properties, including type, name, and type-specific settings, after creation. + +**To edit a field:** + +1. Click the **dropdown arrow** next to the field name +2. Select **Edit field** from the menu +3. Make your desired changes: +4. Click **Save** to apply changes + +![Editing field properties](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/21050e78aa6f439f8468e5b1093c6c6254fbedb6.webp) + +### Change field types + +When converting between field types, Baserow attempts to preserve data by transforming values to the new type. Understanding conversion behavior helps avoid data loss. + +> **Recovery tip:** Press `Ctrl/Cmd + Z` immediately after a conversion to undo and restore original data if values were lost. Learn more about [data recovery][5]. + +### Insert a new field + +Add new fields to the left or right of existing fields for precise positioning. See the [field creation guide][2] for insertion instructions. + +### Duplicate a field + +Create a copy of a field with identical configuration, optionally including data. See the [field creation guide][2] for detailed duplication instructions. + +### Create filters from a field + +Quick-[create filters][6] directly from the field menu to show only relevant rows. This shortcut saves time compared to opening the filter panel and selecting the field manually. For advanced filtering with multiple conditions, see our [filtering guide][6]. + +**To create a field-based filter:** + +1. Click the **dropdown arrow** next to the field name +2. Select **Create filter** +3. The filter panel opens with your selected field pre-populated +4. Choose an operator and value to complete the filter + +![Creating a filter from field menu](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/6469175843f6831a37655e298bb7b805c3c8cd6a.webp) + +### Sort by a field + +Arrange rows based on field values to organize data for analysis or presentation. + +**To sort by a field:** + +1. Click the **dropdown arrow** next to the field name +2. Select **Sort ascending** or **Sort descending** +3. Rows reorganize immediately based on the sort + +Multiple sorts can be applied sequentially; sort by Department first, then by Priority within each department. + +#### Sorting behavior by field type + +| Field type | Ascending order | Descending order | Notes | +|------------|-----------------|------------------|-------| +| **Text fields** | A → Z | Z → A | Alphabetical sorting | +| **Number fields** | 1 → 9 (smallest first) | 9 → 1 (largest first) | Numerical sorting | +| **Date fields** | Oldest → Newest | Newest → Oldest | Chronological sorting | +| **Boolean fields** | ☐ → ☑ (unchecked first) | ☑ → ☐ (checked first) | Binary sorting | +| **Single select** | A → Z or option order | Z → A or reverse order | Can use creation order | +| **Rating fields** | 1 → 5 (lowest first) | 5 → 1 (highest first) | Numerical sorting | +| **Lookup fields** | Based on looked-up value type | Based on looked-up value type | Sorts by linked data | + +> **Unsortable fields:** [File fields][7] cannot be sorted directly. + +**Empty values:** When sorting in ascending order, empty cells typically appear at the top of your table. + +### How to hide fields + +Remove fields from view without deleting data, useful for creating focused views for specific tasks or audiences. + +#### Hide from field header menu + +**To hide a field:** + +1. Click the **dropdown arrow** next to the field name +2. Select **Hide field** +3. The field disappears from the current view + +#### Hide from bulk hide menu + +**To hide multiple fields:** + +1. Click the **Hide fields** button in the view toolbar +2. Toggle visibility for multiple fields simultaneously +3. Click outside the menu to apply changes + +#### Hide from row detail panel + +Hide fields within the [row detail panel][8] for a focused editing experience: + +1. Open a row's detail panel +2. Click the **options menu** beside any field +3. Select **Hide field** + +> **Primary field exception:** You cannot hide the [Primary field][4]; it always remains visible as the primary identifier. + +### How to delete a field + +Remove a field and all its data from your table. Deleted fields move to the trash with a recovery period. Access the trash to [restore deleted fields][5] before permanent deletion. After the grace period, deletion is irreversible. + +**To delete a field:** + +1. Click the **dropdown arrow** next to the field name +2. Select **Delete field** +3. Confirm the deletion in the dialog + + +![Deleting a field in Baserow](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/d0aeed55-5b39-4a09-9701-7b24b6c826c4/Fields%20option%20in%20Baserow.jpg) + +> **Primary field exception:** You cannot delete the [Primary field][4], though you can change its type or designate a different field as primary. + +## Additional field operations + +### Adjust field width + +Change column width in Grid View for optimal data visibility. See the [Grid View guide][9] for width adjustment instructions. + +### How to reorder fields + +Change field positions to organize logically related fields together. + +**Drag-and-drop reordering:** + +1. Click and hold the **field header** in Grid View +2. Drag left or right to your desired position +3. Release to drop the field in place + +![Reordering fields by dragging](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/d4629b8a9716dfd0131a55493bfb263c28fbb669.webp) + +**Reordering in row detail panel:** + +You can also reorder fields when viewing the [row detail panel][8] by dragging fields up or down in the vertical field list. + +![Reordering fields in expanded view](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/0b7a08e3ed96acd2eb4f7be1c918788fda73d151.webp) + +**Use case:** Group all contact fields together (Name, Email, Phone), followed by address fields (Street, City, State, ZIP) for logical data entry flow. + + +### How to group by a field + +Organize rows into collapsible sections based on field values for categorical analysis. Grouping works only in [Grid View][10] and creates hierarchical organization. Add multiple group levels to create nested categorization. Learn more about [grouping strategies][11]. + +**To group by a field:** + +1. Click the **dropdown arrow** next to the field name +2. Select **Group by this field** +3. Rows organize into sections by unique field values + +![Grouping rows by field](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/0c2fa1f3-3a86-4231-b611-3005c98f944f/group%20by%20baserow.png) + +## Advanced field operations + +### Field value constraints + +Field value constraints are data quality rules that Baserow enforces automatically when users create or update rows. Learn more about [field constraints][12]. + +### Field index + +Field indexes are database optimization structures that improve query performance by creating organized reference tables for specific fields. Learn more about the [field index][13]. + +## Frequently asked questions + +### Can I undo field configuration changes? + +Yes, use `Ctrl/Cmd + Z` immediately after changes to undo field edits, deletions, or type conversions. For deleted fields, access the trash within the grace period to restore them. Configuration changes like hiding, sorting, or filtering can be reversed through their respective menus. + +### Do field configuration changes affect other views? + +Some changes affect all views (edit field type, delete field, rename field) while others are view-specific (sort, filter, group, hide, reorder). This design lets you create specialized views from one table without affecting other views. + +### Can I configure multiple fields simultaneously? + +Bulk operations are limited. You can hide/show multiple fields at once through the bulk hide menu, but editing, sorting, or deleting requires individual field actions. For bulk changes, consider using the API or duplicating configured fields. + +### What happens to data when I change a field type? + +Baserow attempts to convert data to the new type. Compatible conversions preserve data (text to long text), while incompatible conversions may lose data (text to number drops letters). Always test conversions on a duplicate table first or use `Ctrl/Cmd + Z` to undo immediately. + +### Can I configure computed fields like Formulas or Lookups? + +Yes, computed fields have specialized configuration options. Formula fields let you edit the calculation, Lookup fields let you change the looked-up field, and automatic fields like Created On have minimal configuration since they generate values automatically. + +### How do I know which views are using a specific field configuration? + +Field configurations like sorts, filters, and grouping apply only to the current view. To see configurations across views, open each view individually. Editing the field type or name affects all views, and you'll see the change reflected everywhere immediately. + +## Related content + +- [Fields overview][1] - Learn about all available field types +- [Create a field][2] - Add new fields to your tables +- [Primary field][4] - Understand the special first field +- [Sorting, filtering, and grouping][14] - Master view customization +- [Data recovery][5] - Restore deleted fields and data +- [Grid View guide][10] - Learn about Grid View-specific features + +--- + + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: /user-docs/baserow-field-overview + [2]: /user-docs/adding-a-field + [3]: /user-docs/field-level-permissions + [4]: /user-docs/primary-field + [5]: /user-docs/data-recovery-and-deletion + [6]: https://baserow.io/user-docs/filters-in-baserow + [7]: /user-docs/file-field + [8]: /user-docs/enlarging-rows + [9]: /user-docs/guide-to-grid-view#adjust-the-width-of-a-field + [10]: /user-docs/guide-to-grid-view + [11]: /user-docs/group-rows-in-baserow + [12]: https://baserow.io/user-docs/field-value-constraints + [13]: https://baserow.io/user-docs/field-indexes + [14]: /user-docs/view-customization",,baserow_user_docs,https://baserow.io/user-docs/field-customization +30,Primary field,primary-field,Baserow primary field,"# Understanding the primary field in Baserow + +The primary field in Baserow is your table's identity column; the name or identifier that represents each row throughout your database, in relationships, forms, and integrations, making it the most important field design decision in your table. + +This guide explains the primary field, the special first field that identifies each row, including how to configure it, change it to a different field, and choose the best field type for row identification. + +Learn more: [Configure field types](https://baserow.io/user-docs/field-customization) + + + +## Overview + +The primary field is the first field in every Baserow table, serving as the unique identifier and display name for each row. When you [link rows between tables][1], create relationships, or reference records elsewhere in your database, Baserow uses the primary field value to represent that row, making it the human-readable ""name"" of your record. + +The primary field is what you see when you need to identify a record quickly. Unlike other fields, the primary field cannot be deleted, hidden, or moved from its first-column position, ensuring every table has a consistent way to identify its rows. + +Choosing the right primary field is crucial for database usability. A well-designed primary field makes records instantly recognizable in dropdowns, relationship pickers, and throughout your workspace. Poor primary field choices (like IDs or dates) force users to open full records to understand what they're looking at. + +![Primary field image][2] + +## Why the primary field matters + +**Record identification:** Primary field values appear as row names in Link-to-table fields, making relationships understandable at a glance. + +**Form integration:** When forms link to other tables, users see primary field values in dropdown selectors to choose related records. + +**API responses:** API queries return primary field values as the main identifier, helping external systems interpret your data. + +**User experience:** Well-chosen primary fields make tables scannable; users recognize records instantly without opening details. + +**Data relationships:** Changing the primary field affects how linked records display across your entire database, impacting all relationship views. + + + +## How to configure the primary field + +While you cannot delete or move the primary field, you can customize it like other fields. + +### **Available configuration options:** + + - **Edit field name and type** - Change what the field is called and what data type it stores + - **Change primary field** - Designate a different field as the primary field + - **[Edit field permissions][3]** - Control who can edit specific database fields + - **[Duplicate the primary field][6]** - Copy primary field configuration to create a backup +- **[Filter by the primary field][5]** - Show only rows with specific identifier patterns + - **[Sort by the primary field][4]** - Arrange rows alphabetically or numerically by identifier + + +### **To access configuration:** + + - Click the **dropdown arrow** next to the primary field name + - Select your desired configuration option from the menu + - Make changes and save + +## How to change which field is primary + +Designate a different field as the primary field when your current primary doesn't effectively identify rows. + +### Method 1: Direct primary field change + +Use this method when you want to immediately swap which field serves as primary. + +**To change the primary field:** + +1. Click the **dropdown arrow** next to the current primary field name +2. Select **Change primary field** from the menu +3. Choose which existing field should become the new primary field +4. Confirm the change + +![Changing the primary field in Baserow](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/9abf02f1-4aa9-4c7b-bb61-8b30f36194d4/primary%20field.jpg) + +**Use this when:** you already have a field with better identifying information, you want to immediately update all relationships, or the new field has complete, non-empty data + +> Changing the primary field affects all [Link-to-table relationships][1] throughout your database. Linked records will display the new primary field value instead of the old one. Review linked tables after changing to ensure relationships still make sense. + +### Method 2: Copy-paste with manual population + +Use this method when you need to transform or combine data before making it the primary field. + +**To create and populate a new primary field:** + +1. [Create a new field][7] with the same data type as your intended primary data +2. Select all data in your current primary field +3. Copy the data (`Ctrl/Cmd + C`) +4. Paste into the new field (`Ctrl/Cmd + V`) +5. Make any necessary edits to the new field's data +6. Use Method 1 above to designate the new field as primary +7. Optionally delete or repurpose the old primary field + +**Use this when:** You need to modify primary field data before making it primary, you want to preserve the old primary field data, you're combining multiple fields into a new primary field, or you want to test the new identifier before fully committing. + +![Copying primary field data](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/568751c8-ebf6-42c4-af27-bf5ffa74580f/Screenshot_2022-07-12_at_11.39.43.png) + +## How to change the primary field type + +Convert your primary field to a different data type while keeping it as the primary identifier. + +### **To change primary field type:** + +1. Click the **dropdown arrow** next to the primary field name +2. Select **Edit field** +3. Choose a new **field type** from the dropdown +4. Configure type-specific settings +5. Click **Save** to apply + +![Changing primary field type](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/342cf938-7f65-4e2c-8d37-4356ac09c2cc/Screenshot_2022-07-12_at_11.57.34.png) + + +> Baserow attempts to convert existing data to the new type, but some conversions may lose data. Use `Ctrl/Cmd + Z` immediately if the conversion loses data you need. + +## Primary field restrictions + +| Restriction | Reason | Workaround | +|-------------|--------|-----------| +| **Cannot delete** | Every row needs an identifier | Designate different field as primary, then delete old one | +| **Cannot hide** | Must always be visible for row identification | Use views to control other field visibility | +| **Cannot move** | Fixed at first position | No workaround; design tables with this in mind | +| **Cannot be link field** | Would create circular reference issues | Use Lookup fields to display linked data | +| **Always required** | Empty primary fields make rows unidentifiable | Design primary field to always have meaningful values | + +These restrictions ensure database consistency and prevent scenarios where rows become unidentifiable or relationships break. + + +## Supported primary field types + +The primary field supports almost all field types, including AI prompt, Created by, Last modified by and Collaborators field, giving you flexibility in how you identify rows: + +| Field type | Best for | Example use case | +|------------|----------|------------------| +| **Single line text** | Names, titles, codes | Customer names, product names, project titles | +| **Long text** | Descriptions | Article titles, note summaries | +| **Number, UUID, Autonumber, Duration** | Numeric IDs, sequential | Invoice numbers, order IDs, ticket numbers | +| **Rating** | Rarely useful | Rating scale values (uncommon) | +| **Boolean** | Not recommended | Only 2 possible values | +| **Date, Last modified, Created on** | Time-based records | Daily log entries, historical events | +| **Email** | User identification | User accounts, contact lists by email | +| **File** | Document identification | File library by filename | +| **URL** | Link-based records | Website directories, bookmark collections | +| **Multiple select** | Display only | Shows multiple tags but limited utility | +| **Single select** | Category-based tables | Status types, priority levels (when each is a unique record) | +| **Phone number** | Contact-based records | Support tickets by caller phone | +| **Formula** | Computed identifiers | Concatenated ""First Name + Last Name"", generated codes | +| **Count, Rollup, Lookup** | Display linked data | Show customer name from linked customer table | + + +> **Not supported:** [Link-to-table fields][1] cannot be a primary field to avoid circular reference issues. + +## Primary field best practices + + - **Choose descriptive identifiers**: Use Single-line text for primary fields. Text-based identifiers are most readable in relationships and forms. + - **Use formulas for compound identifiers**: When no single field uniquely identifies rows, create a Formula field combining multiple fields. Set this Formula field as your primary field for clear, unique identifiers. + - **Ensure uniqueness and completeness**: While Baserow doesn't enforce uniqueness on primary fields (use [unique constraints][constraints] for that), best practice is to ensure every row has a primary field value (no empty cells), primary field values are distinctive (avoid many ""Untitled"" entries), and similar records have distinguishable primary field values + - **Plan before linking**: Choose your primary field carefully before creating link-to-table relationships. Changing it later updates all linked record displays, which may confuse users if the new identifier is less clear than the old one. + +## Frequently asked questions + +### Why can't I delete the primary field? + +Every table needs a way to identify rows. The primary field serves as this universal identifier across Baserow; in relationships, forms, API responses, and the interface. Deleting it would break references and make rows unidentifiable. + +### Can I hide the primary field in specific views? + +No, the primary field cannot be hidden in any view. This ensures rows always have visible identifiers. If you need a view without the primary field visible, consider whether a different table structure might better fit your needs. + +### What happens to linked records when I change the primary field? + +All [link-to-table relationships][1] automatically update to display the new primary field value instead of the old one. For example, if you change from ""Customer ID"" to ""Customer Name,"" all linked records now show the name instead of the ID. + +### Can I use a Lookup field as my primary field? + +Yes, Lookup fields can be primary fields. This displays data from linked tables as your row identifier. For example, in an Orders table, you might make a lookup of Customer Name from the linked Customers table your primary field. + +### Should I use unique identifiers or descriptive names as primary fields? + +Use descriptive names whenever possible. Primary fields appear throughout your database interface, and ""Website Redesign Project"" is far more useful than ""PRJ-001"" for human users. Reserve ID-based primary fields for tables where no descriptive name exists. + +### Can I have the same value in the primary field for multiple rows? + +Technically, yes; Baserow doesn't enforce uniqueness on primary fields. However, duplicate primary field values defeat the purpose of row identification. Use [unique constraints][constraints] on your primary field to prevent duplicates and maintain data quality. + +## Related content + +- [How to change the primary field in Baserow (in 3 clicks)][8] - Step-by-step tutorial +- [Link-to-table field][1] - Understand how primary fields work in relationships +- [Field configuration options][field-config] - Learn about configuring all field types +- [Formula fields][formulas] - Create computed primary field identifiers +- [Unique constraints][constraints] - Enforce uniqueness on primary fields +- [Field types overview][field-types] - Explore all available field types + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + +[constraints]: /user-docs/field-value-constraints +[field-config]: /user-docs/field-customization +[field-types]: /user-docs/baserow-field-overview +[formulas]: /user-docs/understanding-formulas + + + [1]: /user-docs/link-to-table-field + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/2830c058-fff6-458e-9014-72381aeb20eb/Primary%20field.jpg + [3]: https://baserow.io/user-docs/field-level-permissions + [4]: /user-docs/field-customization#sort-fields + [5]: /user-docs/field-customization#create-a-filter + [6]: /user-docs/adding-a-field#duplicate-an-existing-field + [7]: /user-docs/field-customization + [8]: https://medium.com/@baserow/how-to-change-the-primary-field-in-baserow-in-3-clicks-1ecbaa95b522",,baserow_user_docs,https://baserow.io/user-docs/primary-field +31,Single-line text field,single-line-text-field,Baserow single line text field guide,"# Single-line text field in Baserow + +Single-line text fields are Baserow's most versatile field type; perfect for storing names, codes, IDs, and any short text that needs to display in a single row without wrapping. + +This guide covers how to use Single-line text fields to store short text values like names, titles, codes, and identifiers in your Baserow tables. + +## Overview + +Single-line text fields store short text strings that display on one line in your table. Unlike Long text fields that wrap across multiple lines, single-line text keeps content compact and scannable; ideal for names, titles, SKUs, status labels, and other concise data. + +This field type is the default for primary fields and works well for any data where brevity matters. Use single-line text when you need quick readability at a glance without scrolling through lengthy content. + +Learn more: [Configure field types](https://baserow.io/user-docs/field-customization) + +![Baserow Single line text field][1] + +## How to add a Single-line text field + +1. In your table, click the plus sign `+` to [add a new field](/user-docs/adding-a-field). +2. Select **Single line text** from the field type menu +3. Enter a field name +4. Click **Create** + +The field appears immediately and accepts text input. + +## How to set a default value + +Automatically populate new rows with a predefined text value. + +**To set a default text:** + +1. Click the dropdown arrow next to the field name +2. Select **Edit field** +3. In the **Default text** section, enter your default value +4. Click **Save** + +New rows will display this default value automatically. Users can edit or clear it as needed. + +**Use case:** Set ""Pending"" as the default for a Status field so new tasks automatically start with a pending status. + +## When to use Single-line text fields + +- **Names and titles:** Customer names, product titles, project names +- **Identifiers:** SKU codes, order numbers, reference IDs +- **Short descriptions:** Brief labels, tags, status indicators +- **Contact info:** Usernames, display names, short addresses +- **Codes and abbreviations:** Department codes, currency codes, abbreviations + +**Not suitable for:** Paragraphs, descriptions, notes, or any content exceeding 50-100 characters. Use [Long text fields][long-text] for multi-line content. + +## Single line text vs. other field types + +| Your data | Better field type | Why | +|-----------|------------------|-----| +| **Repeated values from list** | [Single select][3] or [Multiple select][4] | Dropdowns prevent typos, ensure consistency | +| **Links to other records** | [Link-to-table][5] | Creates relationships, enables lookups | +| **Long paragraphs** | [Long text][long-text] | Multi-line display with text wrapping | +| **Validated emails** | [Email field][email] | Built-in format validation | +| **Phone numbers** | [Phone number field][phone] | Automatic formatting | + +## Frequently asked questions + +### What's the difference between a single-line text field and a long-text field? + +A **Single-line text field** is for short text (like names or codes) and displays everything on one line. A **[Long-text field][long-text]** is for paragraphs (like notes or descriptions) and wraps text across multiple lines so you can read longer content. + +### When should I use a Single-line text field? + +Use it for any short, concise piece of data, such as names, titles, codes (like SKUs), reference IDs, or short status labels. It's the default and most common field for any brief text. + +### Is there a character limit? + +While there isn't a strict limit, the field is *designed* for short text. Content longer than 50-100 characters will be cut off (truncated) in the grid view, making it hard to read. If you're writing sentences or paragraphs, use a [Long text field][long-text]. + +### What's the difference between this and a Single-select field? + +Use a **Single-line text field** when your values are unique (like a person's name). Use a **[Single-select field][3]** when you are choosing from a *repeated list* of options (like 'Pending', 'In Progress', 'Done'). A single select prevents typos and ensures consistency. + +### Can I use this for emails, phone numbers, or links? + +You *can*, but it's not recommended. Baserow has specialized fields that are better: + + * **[Email field][email]:** Validates that the text is in a correct email format. + * **[Phone number field][phone]:** Automatically formats numbers and makes them clickable on mobile. + * **[URL field][41]:** Validates the link and makes it a clickable button. + +### How do I set a default value? + +You can set a default value (like ""Pending"" for a status field) in the ""Edit field"" menu. Click the dropdown arrow next to the field's name, select **Edit field**, and type your value into the **Default text** box. New rows will now have this value automatically. + + +## Related content + +- [Long text field][long-text] - Multi-line text for descriptions and notes +- [Single select field][3] - Dropdown options for repeated values +- [Primary field][primary] - Learn about the special first field +- [Field types overview][fields] - Explore all available field types + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](https://baserow.io/contact) for questions about Baserow or help with your account + +[email]: /user-docs/email-field +[fields]: /user-docs/baserow-field-overview +[long-text]: /user-docs/long-text-field +[phone]: /user-docs/phone-number-field +[primary]: /user-docs/primary-field + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/c9b26455-5f2c-4622-a10d-e7a3e7e44e3f/Baserow%20Single%20line%20text%20field.jpg + [2]: https://baserow.io/user-docs/adding-a-field + [3]: /user-docs/single-select-field + [4]: /user-docs/multiple-select-field + [5]: /user-docs/link-to-table-field + [41]: /user-docs/url-field + [phone]: /user-docs/phone-number-field + [email]: https://www.google.com/search?q=/user-docs/email-field + [long-text]: https://www.google.com/search?q=/user-docs/long-text-field",,baserow_user_docs,https://baserow.io/user-docs/single-line-text-field +32,Long text field,long-text-field,Baserow: Working with Long text fields,"# Long text field in Baserow + +Long text fields in Baserow handle everything from brief descriptions to detailed notes, with built-in Markdown support and rich text formatting to style your content without leaving your database. + +This guide will cover how to use Long text fields to store multi-line text, descriptions, and notes with optional rich text formatting and Markdown support. + +Learn more: [Configure field types](https://baserow.io/user-docs/field-customization) + +## Overview + +Long text fields store multi-line text that wraps across multiple rows in your table. Unlike [Single-line text fields][1] that display content on one line, Long text fields expand vertically to accommodate paragraphs, lists, and formatted content. + +This field type supports plain text or rich text formatting with Markdown, making it ideal for descriptions, notes, documentation, and any content requiring structure or emphasis beyond plain text. + +![Baserow Long text image][2] + +## When to use Long text fields + +- **Product descriptions:** Multi-paragraph descriptions with formatting +- **Project notes:** Meeting notes, updates, detailed documentation +- **Instructions:** Step-by-step guides, procedures, how-tos +- **Comments and feedback:** Customer feedback, review notes, internal comments +- **Rich content:** Formatted text with headings, lists, bold/italic styling + +The Long text field is not suitable for short labels, names, or single-line text. Use [single line text][1] for concise content. + +## How to add a Long text field + +1. Create a new field [following these steps][3] +2. Select **Long text** from the field type menu +3. Enter a field name +4. Click **Create** + +> **Keyboard shortcut:** Press `Shift + Enter` in Grid View to exit editing mode without adding a line break. + +## How to expand Long text fields + +**Cell resize:** Click and drag the handle at the bottom-right corner of the cell to increase height for more visible text without opening the full editor. + +**Row detail panel:** Click the [expand row icon][4] to open the full editor with more space for editing lengthy content. + +![Expanding Long text field](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/2d3356b5-7262-4bab-9a23-c99b78dd1852/55bfad6eaad6609c1df0c0fc480c4c39b33c0631.webp) + +## How to enable rich text formatting + +Add styling capabilities to Long text fields for formatted content with headings, emphasis, and structure. + +**To enable rich text:** + +1. Click the dropdown arrow next to your Long text field name +2. Select **Edit field** +3. Check **Enable rich text formatting** +4. Click **Save** + +Once enabled, you can format text using the toolbar or [Markdown shortcuts][5]. + +![Rich text formatting options](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/65df26a3-a638-43d6-94b7-50d1daf413ba/Untitled.png) + +**To format text:** + +1. Double-click a cell to enter edit mode +2. Click the expand icon for the full editor +3. Use the formatting toolbar or type Markdown syntax +4. Apply styles: **Bold** (Ctrl+B), *Italic* (Ctrl+I), Underline (Ctrl+U), ~~Strikethrough~~ (Ctrl+S) + +### Markdown formatting reference + +Baserow supports standard Markdown syntax in Long text fields with rich text enabled. + +**Keyboard shortcuts:** Use standard text editor shortcuts (Ctrl/Cmd+B for bold, Ctrl/Cmd+I for italic, etc.) for quick formatting. + +| Format | Markdown | Result | +|--------|----------|--------| +| **Heading 1** | `# Heading` | Large heading | +| **Heading 2** | `## Subheading` | Medium heading | +| **Heading 3** | `### Subheading` | Small heading | +| **Bold** | `**bold**` or `__bold__` | **bold text** | +| **Italic** | `*italic*` or `_italic_` | *italic text* | +| **Bold Italic** | `**_bold italic_**` | ***bold italic*** | +| **Underline** | `underline` | underlined | +| **Strikethrough** | `~~strike~~` | ~~strikethrough~~ | +| **Bulleted list** | `- Item` | • Item | +| **Numbered list** | `1. Item` | 1. Item | +| **Checkbox** | `- [ ]` unchecked
`- [x]` checked | ☐ ☑ | +| **Blockquote** | `> Quote` | Indented quote | +| **Code block** | ` ```code``` ` | Formatted code | +| **Link** | `[text](url)` | Clickable link | +| **Mention** | `@Name` | [Notify collaborator][6] | + +![Styling with rich text](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/21dcd7b7-8438-46b4-b384-0f3cab58124f/New%20styling%20options%20for%20the%20long%20text%20field.png) + +### Rich text in forms and formulas + +**Forms:** Long text fields with rich text enabled display the same formatting options in [Form Views][forms], allowing form respondents to submit formatted content. + +**Formulas:** When [Formula fields][7] reference Long text fields with rich text, formulas display only plain text and line breaks; formatting is stripped in calculations. + +## Plain text vs. rich text + +| Feature | Plain text | Rich text | +|---------|-----------|-----------| +| **Multi-line support** | ✅ Yes | ✅ Yes | +| **Formatting (bold, italic)** | ❌ No | ✅ Yes | +| **Headings and structure** | ❌ No | ✅ Yes | +| **Links and mentions** | ❌ No | ✅ Yes | +| **Best for** | Simple notes, data imports, minimal formatting needs, or when you want smallest file size. | Documentation, instructions, formatted descriptions, or any content benefiting from visual structure. | + + + +## Frequently asked questions + +### What's the difference between a Long text and a Single-line text field? +A [Single-line text field][1] is for short text like names or labels that fit on one line. A **long text field** is for multi-line content like descriptions, notes, and paragraphs. It can be expanded and optionally supports rich text formatting (bold, headings, lists, etc.), which the Single-line text field does not. + +### How do I use bold, headings, or bullet points? +Your field must have rich text formatting enabled first. Once enabled, you can use the formatting toolbar that appears when editing the cell or use standard [Markdown shortcuts][5]. + +### How do I add a new line in a cell? +While editing a cell in Grid View, just press **Enter** to create a line break. To exit editing mode *without* adding a new line, press **Shift + Enter** or click outside the cell. + +### What happens to my formatting if I use this field in a formula? +If you reference a rich text-enabled Long text field in a [formula][7], only the **plain text** will be used. All formatting (like bold, headings, and lists) will be stripped from the calculation, though line breaks will be preserved. + +### Can I @mention a teammate in a long text field? +Yes. If rich text formatting is enabled, you can type `@` followed by a [collaborator's name to mention them][6] in the field. This works just like it does in row comments. + +## Related content + +- [Single-line text field][1] - Short, single-line text storage +- [Formula fields][7] - Use long text in calculations +- [Row commenting][6] - Collaborate with mentions +- [Keyboard shortcuts][5] - Speed up text formatting +- [Field types overview][8] - Explore all field types + + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + +[forms]: /user-docs/guide-to-creating-forms-in-baserow + + + [1]: /user-docs/single-line-text-field + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/cabb7ec0-d841-4d0f-acf3-abfa8216ca60/Baserow%20%20Long%20text%20field.jpg + [3]: https://baserow.io/user-docs/adding-a-field + [4]: /user-docs/navigating-row-configurations + [5]: /user-docs/baserow-keyboard-shortcuts + [6]: /user-docs/row-commenting + [7]: /user-docs/formula-field-overview + [8]: /user-docs/baserow-field-overview",,baserow_user_docs,https://baserow.io/user-docs/long-text-field +33,Number field,number-field,Baserow Number field: How to use it,"# Number field + +The Baserow **Number field** makes it easy to store, format, and perform calculations on numerical data. + +This guide explains what the Baserow Number field is, when to use it, and how to customize its formatting options, such as setting decimal places, allowing negative numbers, and adding prefixes like currency symbols. + +Learn more: [Configure field types](https://baserow.io/user-docs/field-customization) + +![Baserow Number field][2] + +## Overview + +A Number field is designed specifically to store numerical values. It's the best choice for the data you need to use in mathematical calculations, such as: + +* Prices or costs +* Quantities or inventory levels +* Ratings or scores +* Measurements (e.g., weight, height, distance) + +For numerical data that **is not** used in math, other field types are more appropriate. For example, it's better to use a **Phone number field** for contact numbers or a **[Single-line text field][1]** for postal codes. This prevents them from being accidentally formatted as large numbers or included in calculations. + +You can format Number fields to show integers (whole numbers) or decimals, allow or block negative values, and add text prefixes (like `$` or `€`) or suffixes (like `kg` or `cm`). + +## How to add a Number field + +1. In your table, click the plus sign `+` to [add a new field](/user-docs/adding-a-field). +2. A search menu will appear. Type ""Number"" and select the **Number** field type. +3. Give your field a name, like ""Price"" or ""Quantity."" +4. Click **Create**. + + + +## Customize the Number field + +Once you create a Number field, you can click the dropdown arrow by its name and select **Edit field** (or double-click the field header) to access the customization menu. + + +Here are the available formatting options: + +* **Number of decimal places:** Choose how many digits to display after the decimal point. Select `0` for whole numbers (integers) or any value from `1` to `10` for decimal numbers. +* **Allow negative numbers:** Toggle this on if you need to store negative values, such as for financial balances or temperatures. If toggled off, any negative numbers pasted or typed in will be stored as `0`. +* **Prefix:** Add static text *before* the number. This is ideal for units like currency symbols (`$`, `€`, `£`) or other symbols. +* **Suffix:** Add static text *after* the number. This is useful for units of measurement like `kg`, `cm`, or `%`. +* **Thousand separator:** Choose the character to separate thousands (e.g., a comma `1,000` or a period `1.000`). +* **Decimal separator:** Choose the character for the decimal point (e.g., a period `1.23` or a comma `1,23`). +* **Default value:** Set a value that will automatically populate in this field for every new row created. Leave it blank to default to empty. + + + +## Frequently asked questions + +### What's the difference between a Number field and a Single-line text field? +A **Number field** is for data used in calculations (like prices or quantities). A **[Single-line text field][1]** is for text, even if that text includes numbers (like postal codes or ID numbers). Using a Number field ensures your data is treated as a number for formulas, sorting, and filtering. + +### Can I use the Number field in calculations? +Yes. The Number field is the primary field type to use with the **Formula field**. You can reference Number fields in your formulas to perform addition, subtraction, multiplication, division, and more. + +### How do I show currency symbols like $ or €? +Use the **Prefix** option in the field customization menu. Click the dropdown on your Number field, select ""Edit field,"" and type the currency symbol (like `$`) into the ""Prefix"" input box. The symbol will now appear before the number in every cell for that field. + + + +## Related content +* [Formula field reference][3] +* [Single line text field][4] +* [Phone number field][5] +* [Rollup field][6] +* [Lookup field][7] + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we’re ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account. + + + [1]: /user-docs/single-line-text-field + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/0d5acbfe-ab46-4d9e-b884-ce6ccfaede6b/Number%20field.jpg + [3]: /user-docs/understanding-formulas + [4]: /user-docs/single-line-text-field + [5]: /user-docs/phone-number-field + [6]: /user-docs/rollup-field + [7]: /user-docs/lookup-field",,baserow_user_docs,https://baserow.io/user-docs/number-field +34,Rating field,rating-field,Rating field in Baserow,"# Rating field + +The Baserow **Rating field** provides a quick, visual way to rank or assess items in your database. + +This guide covers the Baserow Rating field, explaining how to add it to your table, customize its appearance (such as changing the symbol and color), and set its maximum value. + +![Baserow Rating field image][1] + +## Overview + +A Rating field allows you to assign a visual rating to a row, typically using symbols like stars, hearts, or checkmarks. This field is perfect for tasks that require quick, visual assessment, such as: + +* Ranking sales leads (e.g., 1-5 stars) +* Assessing project priority +* Gathering feedback or reviews +* Marking items as 'favorites' with a single heart + +You can set a maximum rating from 1 to 10 symbols. Unlike a Number field, the Rating field is designed for intuitive, click-based ranking rather than complex mathematical data entry. + +## How to add a Rating field + +1. In your table, click the plus sign `+` to [add a new field](/user-docs/adding-a-field). +2. Search for and select the **Rating** field type from the list. +3. Give the field a name, like ""Priority"" or ""Review Score."" +4. From this initial menu, you can immediately select: + * **Style:** The symbol to use (Star, Heart, Thumbs Up, Flag, etc.). + * **Color:** The color of the symbol (e.g., yellow, red, blue). + * **Max value:** The highest possible rating (e.g., `5` for a 5-star rating). You can set any maximum value up to 10. +5. Click **Create**. + +## How to set a rating + +Once the field is created, you can set a rating in any cell: + +* **Mouse:** Hover over the cell and click the desired symbol. For a 3-star rating, click the third star. +* **Keyboard:** Select the cell and type a number (e.g., `3`) to assign that rating. +* **To clear a rating:** You can either click the symbols again to set it to 0 or select the cell and press the `Backspace` or `Delete` key. + +## Customize the Rating field + +You can change the look and scale of your Rating field at any time. Double-click the field's header or click the dropdown arrow next to its name and select **Edit field**. + +This will open the customization menu where you can change: + +* **Style:** Change the symbol. +* **Color:** Choose from several different colors for the selected symbol. +* **Max value:** Adjust the maximum rating, from 1 to 10. + +Learn more: [Configure field types](https://baserow.io/user-docs/field-customization) + +## Frequently asked questions + +### Can I use the Rating field in a formula? +Yes. When you reference a Rating field in a formula, it outputs its numerical value. For example, a 4-star rating will be treated as the number `4`, allowing you to perform calculations with it. + +### What's the difference between a Rating field and a Number field? +A **Rating field** is a visual and interactive element, designed for quick assessment (such as stars). A **Number field** is for storing any numerical data (like price or quantity) and is the primary choice for mathematical inputs. While you *can* use ratings in formulas, the Number field is the standard for calculations. + +### Can I set a half-star or decimal rating? +No, the Rating field only supports whole numbers (integers). You cannot set a rating of 2.5. If you need to store decimal ratings, you should use a **Number field**. + + +## Related content +* [Formula field reference][2] +* [Number field][3] +* [Boolean field][4] +* [Single select field][5] + +--- + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we’re ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account. + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/ec55816d-1653-4185-9d5f-cca558157357/Baserow%20Rating%20field.jpg + [2]: /user-docs/understanding-formulas + [3]: /user-docs/number-field + [4]: /user-docs/boolean-field + [5]: /user-docs/single-select-field",,baserow_user_docs,https://baserow.io/user-docs/rating-field +35,Boolean field,boolean-field,Boolean field in Baserow table,"# Boolean field + +The **Baserow Boolean field** makes it easy to track binary (yes/no, true/false) information with a simple checkbox. + +This guide covers what the Baserow Boolean field is, why it's used, and how to add and use it in your tables. + +![How to add a Boolean field in Baserow][1] + +## Overview + +A Boolean field is a data type that stores information in a binary true/false format. In Baserow, this is represented by a checkbox. You can click the box to set its value to `true` (checked) or leave it empty to set the value to `false` (unchecked). + +This field is perfect for any data that has only two possible states. Common examples include: +* Marking a task as ""Done"" +* Tracking if a contact has ""Subscribed"" to a newsletter +* Noting if an item is ""In Stock"" +* Confirming if a requirement has been ""Met"" + + + +## How to add a Boolean field + +To add a Boolean field to your table: + +1. In your table, click the plus sign `+` to [add a new field](/user-docs/adding-a-field). +2. Search for and select **Boolean** from the list. +3. Name your field (e.g., ""Done,"" ""Subscribed""). +4. (Optional) You can set a default state. Check the **Default value** box if you want all new rows to have this field checked (`true`) by default. +5. Click **Create**. + + + + + +## How to use a Boolean field + +Once added, you can interact with the Boolean field in two simple ways: + +* **Mouse:** Click the checkbox in the cell to toggle it between checked (true) and unchecked (false). +* **Keyboard:** Select a boolean cell using your arrow keys and press the `Spacebar` or `Enter` key to check or uncheck it. + + + +Learn more: [Configure field types](https://baserow.io/user-docs/field-customization) + +## Frequently asked questions + +### What is a Boolean field used for? +A Boolean field is used to store any data that has only two opposite states, like yes/no, true/false, or on/off. In Baserow, it's shown as a checkbox, making it easy to see and update the status of a row. + +### How is a Boolean field different from a Single select field? +A **Boolean field** is for binary data only (true/false). A **Single select field** is for data that can have one of several custom options (e.g., ""To Do,"" ""In Progress,"" ""Done""). + +If you only need to track a ""yes"" or ""no"" status, the Boolean field is faster and more efficient. If you need more than two states, use a Single select field. + +### Can I filter rows using a Boolean field? +Yes. You can create a view and filter your rows based on the Boolean field. The filter conditions will be ""is checked"" (true) or ""is unchecked"" (false). This is very useful for creating views like ""Completed Tasks"" or ""Active Subscribers."" + + + +## Related content +* [Introduction to fields in Baserow][2] +* [Filter by a field in Baserow][3] +* [Single select field][4] +* [Rating field][5] + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we’re ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](https://baserow.io/contact) for questions about Baserow or help with your account. + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/6cd089c7-0fd5-4b04-8179-7a4f0ee0a72b/How%20to%20add%20a%20boolean%20field%20in%20Baserow.jpg + [2]: /user-docs/baserow-field-overview + [3]: /user-docs/filters-in-baserow + [4]: /user-docs/single-select-field + [5]: /user-docs/rating-field",,baserow_user_docs,https://baserow.io/user-docs/boolean-field +36,Date and time fields,date-and-time-fields,Baserow date and time field guide,"# Date and time fields + +Baserow's **Date field** makes it easy to store, format, and manage specific dates and times, perfect for tracking deadlines, appointments, and events. + +This guide covers the manual **Date field** and the automatic **Created on** field. You'll learn how to add them, customize their formats, and use them to track your data. + +![Adding a new date field in Baserow][1] + +## Overview + +Baserow provides these main field types for handling dates and times: + + 1. **Date field (Manual):** This is a standard, editable field where you manually input a date and time, or select one from a calendar picker. It's used for data like deadlines, birthdays, or project start dates. + 2. **Created on (Automatic):** This field is not editable. It automatically captures and displays the exact date and time that a row was added. + 3. **[Last modified field][2] (Automatic)**: This field is not editable. It automatically captures and displays the exact date and time that a row was edited. + +## Date field (Manual) + +This is the primary field for adding any customizable date or time to your table. + +### How to add a Date field + +1. In your table, click the plus sign `+` to [add a new field](/user-docs/adding-a-field). +2. Select **Date** from the list. +3. Name your field (e.g., ""Deadline,"" ""Start Date""). +4. Click **Create**. + + + +### How to use the Date field + +You can add data to the cell in two ways: +* **Manual Entry:** Type a date (and time) directly into the cell. Baserow will parse it based on the field's format. +* **Calendar Picker:** Click the cell to open an interactive calendar. You can use this to select a date and, if enabled, a specific time. + +Learn more: [Configure field types](https://baserow.io/user-docs/field-customization) + + + +### Date and time field customization + +You can change the format for any date field. Click the dropdown arrow next to the field name, select **Edit field**, and then choose your preferred format. + +#### Date format +You can set your preferred date format from the drop-down menu: + +* **European:** `DD/MM/YYYY` (e.g., 20/02/2020) +* **US:** `MM/DD/YYYY` (e.g., 02/20/2020) +* **ISO:** `YYYY-MM-DD` (e.g., 2020-02-20) + +#### Time format +You can add a time component to the Date field by toggling **Include time**. This allows you to select a time format: + +* **24-hour:** (e.g., 23:00) +* **12-hour:** (e.g., 11:00 PM) + +When enabled, the calendar picker will also include a time selection menu. + + +## Created on field (Automatic) + +The **Created on** field is a separate, automatic field type. It displays the exact date and time a row was created. + +* **Automatic:** The value is set automatically by Baserow when the row is made. +* **Not Editable:** You cannot manually change the date or time in this field. + +This field is useful for auditing, tracking new entries, or sorting your data by creation date. Like the manual Date field, you can customize its date and time format. + +![A Baserow table showing the 'Created on' field][3] + +## Last modified field (Automatic) + +This field is not editable. It automatically captures and displays the exact date and time that a row was edited. + +Learn more: [Last modified field][2] + +## Frequently asked questions + +### What's the difference between the Date field and the Created on field? +The **Date field** is for manual entry. You use it to store dates that *you* provide, like a deadline or a birthday. The **Created on field** is automatic. It captures the exact moment the row was created, and you cannot edit it. + +### What timezone do the date fields use? +By default, the `Date` field and `Created on` field display time based on your computer's local timezone. You can learn more about how Baserow handles timezones in [our timezones article][7]. + +### Can I filter by a Date field? +Yes. You can filter rows based on the Date field (e.g., ""is before,"" ""is after,"" ""is within,"" ""is today""). This is a powerful way to create views like ""Tasks due this week"" or ""New entries today."" You can learn more in our [advanced filtering guide][8]. + +### How is the 'Last modified' field different? +The [Last modified field][9] is another automatic field. While `Created on` shows when a row was *made*, `Last modified` shows the last time any cell *in that row* was edited by a user. + + + +## Related content +* [Advanced filtering by a field][8] +* [Working with timezones][7] +* [Field configuration options][10] +* [Last modified field][9] +* [Formula field reference][11] + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we’re ready to assist you. + +-  [Ask the Baserow community](https://community.baserow.io) +-  [Contact support](/contact) for questions about Baserow or help with your account. + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/61e64329-cc43-4c24-b55d-12da23575e81/Baserow%20date%20field.jpg + [2]: https://baserow.io/user-docs/last-modified-field + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/0f1e44cd-be1f-4c39-b043-9cd690000c72/Baserow%20created%20on%20field.jpg + [4]: https://baserow.io/user-docs/subscriptions-overview + [5]: https://baserow.io/user-docs/customize-a-table + [6]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/be957e7c-0a80-4956-993c-80c2836cd6f9/date_dependency.png + [7]: /user-docs/working-with-timezones + [8]: /user-docs/advanced-filtering + [9]: /user-docs/last-modified-field + [10]: /user-docs/field-customization + [11]: /user-docs/understanding-formulas",,baserow_user_docs,https://baserow.io/user-docs/date-and-time-fields +37,URL field,url-field,Baserow URL field setup guide,"# URL field + +The **Baserow URL field** makes it easy to store and access clickable web links directly from your table. + +This guide covers how to add, use, and manage the URL field in your Baserow tables. + +![How to add a URL field in Baserow image][1] + +## Overview + +The URL field is designed to hold a single hyperlink in each cell. This allows you to link directly to external web pages, documents, images, or any other online resource. + +When you click on a cell containing a valid URL, Baserow will open that link in your device's default web browser. This is perfect for tracking website links, social media profiles, or references for your projects. + +## How to add a URL field + +1. In your table, click the plus sign `+` to [add a new field](/user-docs/adding-a-field). +2. Select **URL** from the list. +3. Name your field (e.g., ""Website,"" ""Profile Link""). +4. Click **Create**. + +Learn more: [Configure field types](https://baserow.io/user-docs/field-customization) + +## How to use the URL field + +Simply click into a cell and type or paste the full URL, including `http://` or `https://`. + +* **To open a link:** Click the URL in the cell. It will open in a new tab in your web browser. +* **To edit a link:** Double-click the cell, or press `Enter` while the cell is selected, to edit the text. + + + +## Frequently asked questions + +### How is a URL field different from a text field? +A **Single line text field** will store a URL as plain text, but it won't be a clickable link. The **URL field** formats the text as a hyperlink, allowing you to click it to open the link directly. + +### What happens if I enter an invalid URL? +The URL field will store any text you enter. However, it does not validate the URL. If you enter text that is not a functional web address (like ""my website"" instead of ""https://my-website.com""), your browser will likely show an error when you try to open it. + +### Can I link to files on my computer? +No. The URL field is for web-based hyperlinks (starting with `http://`, `https://`, `mailto:`, etc.). It cannot access local files on your computer (like `C:\Documents\file.pdf`) for security reasons. To store files, use the **File field**. + + + +## Related content +* [Introduction to fields in Baserow][3] +* [Email field][4] +* [File field][5] +* [Single line text field][6] + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we’re ready to assist you. + +-  [Ask the Baserow community](https://community.baserow.io) +- [Contact support](https://baserow.io/contact) for questions about Baserow or help with your account. + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/59cbcb03-bb05-4bd4-bdf9-491fba3a8fc7/How%20to%20add%20a%20URL%20field%20in%20Baserow.jpg + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/7e206825-3add-4c77-9a7c-ef9fcbf8d014/Screenshot_2022-07-14_at_12.01.12.png + [3]: /user-docs/baserow-field-overview + [4]: /user-docs/email-field + [5]: /user-docs/file-field + [6]: /user-docs/single-line-text-field",,baserow_user_docs,https://baserow.io/user-docs/url-field +38,Email field,email-field,Baserow email field setup and configuration,"# Email field + +The **Baserow Email field** makes it easy to store and interact with clickable email addresses, launching your default email client with a single click. + +This guide covers how to add and use the Baserow Email field to store and interact with email addresses. + +Learn more: [Configure field types](https://baserow.io/user-docs/field-customization) + + +![Adding a new Email field in Baserow][1] + +## Overview + +The Email field is designed to store a single email address per cell. This field is ideal for managing contact lists, sales leads, or user directories. + +When you click on an email address stored in this field, Baserow automatically launches your computer's default email client (like Mail, Outlook, or Gmail in your browser) with the address pre-filled in the ""To:"" line. This allows you to quickly send a message without needing to copy and paste. + + + +## How to add an Email field + +1. In your table, click the plus sign `+` to [add a new field](/user-docs/adding-a-field). +2. Select **Email** from the list. +3. Name your field (e.g., ""Contact Email,"" ""Lead""). +4. Click **Create**. + + + + +## How to use the Email field + +Simply type or paste the email address into the cell. + +* **To send an email:** Click the email address in the cell. Your default email client will open, ready to compose a new message. +* **To edit the address:** Double-click the cell, or press `Enter` while the cell is selected, to edit the text. + + + + +## Frequently asked questions + +### How is the Email field different from a text field? +A **Single line text field** will store an email as plain text, but it won't be clickable. The **Email field** formats the text as a `mailto:` link, making it interactive and allowing it to launch your email client. + +### Does the Email field check if the email is valid? +The field checks that the value is a valid email; however, it does not perform external validation to see if the email address actually exists. It stores the email you enter, but it is formatted to *function* as an email link. + +### Can I store multiple email addresses in one cell? +No, the Email field is designed for a **single** email address. If you need to link to multiple contacts, it's better to use a **Link-to-table field** to connect to separate ""Contact"" rows, each with its own email field. + + + +## Related content +* [Introduction to fields in Baserow][3] +* [Single-line text field][4] +* [URL field][5] +* [Phone number field][6] + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we’re ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](https://baserow.io/contact) for questions about Baserow or help with your account. + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/d071698c-3956-4884-93fb-16cf01eb7307/Adding%20a%20new%20email%20field%20in%20Baserow.jpg + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/2041b4dd-3fe4-41d7-9dc7-7807467bb839/Screenshot_2022-07-14_at_12.08.34.png + [3]: /user-docs/baserow-field-overview + [4]: /user-docs/single-line-text-field + [5]: /user-docs/url-field + [6]: /user-docs/phone-number-field",,baserow_user_docs,https://baserow.io/user-docs/email-field +39,File field,file-field,File field in Baserow table,"# File field + +The **Baserow File field** makes it easy to attach one or more files directly to a row, keeping all your related assets in one central location. + +This guide covers how to use the Baserow File field to upload, manage, and preview attachments like images, documents, and videos in your table. + +![Adding a new file field in Baserow][1] + +## Overview + +The File field allows you to add a wide range of multimedia files to your rows, including images, documents, videos, and more. You can upload multiple files into a single cell, making it an invaluable tool for managing project documents, product images, or any other related assets. + +Once files are uploaded, Baserow generates a thumbnail for supported types, allowing you to see a preview at a glance. + +> **Note:** If the number of characters in the filename is higher than 64, then Baserow truncates the filename to a maximum of 64 characters. All the characters in the middle will be replaced with `...` + +## How to add a File field + +1. In your table, [add a new field](/user-docs/adding-a-field). +2. Select **File** from the list. +3. Name the field (e.g., ""Attachments,"" ""Product Images""). +4. Click **Create** to add the field to your table. + + +## How to upload files + +You can upload files from your device or by providing a public URL. + +### Upload from your device +You have three ways to upload files from your computer: + +* **Cell Uploader:** Click the `+` icon in a cell to open the file uploader. You can then click to select files or drag-and-drop files into this dialog. +* **Direct Drag-and-Drop:** Drag a file from your computer and drop it directly onto a cell in the File field. +* **Enlarged Row:** Open the [enlarged row view][3] (by clicking the expand icon) and click **Add a file** or drag files into the upload box. + +![drag and drop files](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/3fb52c3d-49b1-4aca-8f06-1fc7eb63f989/7e792b489e8ae8391d10036fe72dc0a944605d74.webp) + + +### Upload from a URL +1. Click the `+` icon in the cell to open the uploader. +2. Select **a URL** at the bottom of the dialog. +3. Paste the file's public URL into the text box. +4. Click **Upload**. + + +## How to manage uploaded files + +The easiest way to manage multiple files is from the enlarged row view. Once you have uploaded files, you can hover over any file to: + +* **Rename:** Click the pencil icon to rename the file. +* **Download:** Click the download icon to save the file to your device. +* **Delete:** Click the trash bin icon to remove the file from the cell. + +Learn more: [Configure field types](https://baserow.io/user-docs/field-customization) + +You can also click on a file to open a full-screen preview. In the preview mode, you can find the rename, download, and delete options. + +![Managing files in the enlarged row view][5] +![Previewing a single file in Baserow][6] + + + +## File previews and supported types + +When you upload a file, Baserow generates a small thumbnail in the cell for supported file types. + +![File previews shown as thumbnails in a cell][7] + +### Supported file types +While you can upload any file type, Baserow can only generate previews for the following formats: + +* **Images:** .png, .heic, .jpg, .webp, .gif, .svg, .psd, .tiff +* **Documents:** .doc, .docx, .xls, .xlsx, .csv, .txt, .pdf +* **Presentations:** .ppt, .pptx (without embedded videos) +* **Audio/Video:** .mp3, .mp4, .webM, .ogg, .ogv +* **Other:** .xml + + + +## Frequently asked questions + +### What are the file size and storage limits? +This depends on your Baserow plan: + +* **Cloud:** The maximum file upload size is **100MB per file**. Files larger than this will fail to upload. All uploaded files count toward the total storage limit for your workspace, which is set by your subscription plan. +* **Self-hosted:** By default, the maximum file upload size is **1TB**. This can be configured by your system administrator by changing the `BASEROW_FILE_UPLOAD_SIZE_LIMIT_MB` environment variable. [Self-hosted deployments][8] do not have data or table limits imposed by Baserow. + +### How is the File field different from the AI field? +The **File field** is for *storage*. You upload files, and Baserow stores them. The **[AI field][9]** is for *generation*. It can *use* a file from a File field (or a URL) as a source to perform a task, like summarizing a document or describing an image. + +### Can I just use a URL field to link to a file? +Yes, but a **[URL][10]** only stores the *link* to the file. If the file at that link is moved or deleted, your link will be broken. The **File field** uploads and *stores a copy* of the file within Baserow. This is more reliable, generates a preview, and ensures the file is always available from your database. + +## Related content +* [Guide to Gallery view][70] +* [AI field][59] +* [URL field][41] +* [Enlarging rows][80] +* [Introduction to fields in Baserow][25] + + + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we’re ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account. + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/51c712e3-d296-4eb2-ab14-42a521b32a42/Adding%20a%20new%20File%20field%20in%20Baserow.jpg + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/aca34759-37e5-492a-af2b-40fed15a5423/Screenshot_2022-07-13_at_19.37.54.png + [3]: https://baserow.io/user-docs/enlarging-rows + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/8c1c00a8-2256-4b46-bf42-5d45e60ae48a/Screenshot_2022-07-13_at_19.31.55.png + [5]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/f4f979c3-5e49-4e7d-9af2-e16b2958f6ac/Screenshot_2022-07-13_at_21.01.53.png + [6]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/2115158d-be30-4bf0-9c10-2de8f162de2a/Screenshot_2022-07-13_at_21.07.11.png + [7]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/29b424b1-27ad-41db-ad85-028c21d4ea1d/Screenshot_2022-07-13_at_21.43.36.png + [8]: https://baserow.io/docs/installation%2Fconfiguration#backend-configuration + [9]: /user-docs/ai-field + [10]: /user-docs/url-field + [25]: /user-docs/baserow-field-overview + [41]: /user-docs/url-field + [59]: /user-docs/ai-field + [70]: /user-docs/guide-to-gallery-view + [80]: /user-docs/enlarging-rows",,baserow_user_docs,https://baserow.io/user-docs/file-field +40,Single select field,single-select-field,Single select field in Baserow,"# Single select field + +The **Baserow Single select field** makes it easy to categorize rows by letting you choose one option from a customizable, color-coded dropdown list. + +This guide covers how to use the Single select field, including how to add, customize, and manage a predefined list of options. + +![Adding a new Single select field in Baserow][1] + +## Overview + +A Single select field is ideal when you need to choose only one item from a predefined list of choices. A classic example is a ""Status"" field with options like ""To Do,"" ""In Progress,"" and ""Done."" + +When you edit a cell in this field, an autocomplete menu appears. You can type to filter the list or select your preferred option from the dropdown. This ensures data consistency and speeds up data entry. + + + +## How to add a Single select field + +1. In your table, [add a new field](/user-docs/adding-a-field). +2. Select **Single select** from the list. +3. Name the field (e.g., ""Status,"" ""Priority""). +4. You can immediately start adding options in the ""Add an option"" box. +5. Click **Create**. + +## How to use the Single select field + +Once the field is created, you have two ways to add data: + +* **Select an existing option:** Click the cell to open the dropdown menu and click the option you want to select. You can also type to filter the list. +* **Create a new option (on-the-fly):** If the option doesn't exist, type the new value into the cell and select the **+ Create new option** button that appears. This adds the new option to the field's list permanently. + +![Selecting an option in a Single select field][2] + + + +## How to customize single select options + +You can manage your list of options at any time. Click the dropdown arrow next to the field name and select **Edit field**. + +From this menu, you can add, edit, reorder, and delete options. A key benefit is that if you edit an option (e.g., change ""Yellow"" to ""Green""), all rows that previously had ""Yellow"" will be automatically updated to ""Green."" + +Learn more: [Configure field types](https://baserow.io/user-docs/field-customization) + +### Add a new option +In the ""Edit field"" menu, type a new value in the **+ Add an option** box and press Enter. + + +![Adding a new option in the field customization menu][1] + +### Edit an option +Click on the name of any existing option, type the new name, and click **Save** or click outside the box. + +### Reorder options +Click and drag the handle icon (⋮⋮) to the left of an option's name to move it up or down in the list. + +![Reordering options in a Single select field][4] + +### Change option colors +Click the colored circle to the left of an option's name to choose from 15 different colors. + +![Changing the color of a single select option][5] + +### Delete an option +Click the `X` icon to the right of an option's name to delete it. +> **Warning:** When you delete an option, any cell that used that option will become empty. This can also affect [Kanban views][6] that are grouped by this field, which may cause rows to become uncategorized. + + + +## Set a default value + +You can set a default value that will be automatically applied to all new rows created in the table. + +1. Click the dropdown arrow next to the field name and select **Edit field**. +2. In the field customization dialog, find the **Default option** section. +3. Select your desired default option from the dropdown menu. +4. Click **Save**. + + + +## Frequently asked questions + +### What's the difference between a Single select and a Multiple select field? +A **Single select** field allows you to choose *only one* option from the list. A **[Multiple select field][7]** allows you to choose *one or more* options from the list. + +### When should I use a Single select vs. a Link-to-table field? +Use a **Single select** field for simple, static categories (like ""Status"" or ""Priority""). Use a **[Link-to-table field][8]** when your options are more complex and need their *own* data. For example, if you're selecting a ""Country,"" you might want the ""Country"" to be a link to a separate ""Countries"" table that stores its population, flag, and capital city. + +### What happens if I delete a Single select option? +Deleting an option from the field's customization menu will remove it from the list permanently. Any cell in that field that was using the deleted option will become empty. + + + +## Related content +* [Filter by a field in Baserow][9] +* [Field configuration options][10] +* [Guide to Kanban View][6] +* [Multiple select field][7] +* [Link-to-table field][8] + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we’re ready to assist you. + +-  [Ask the Baserow community](https://community.baserow.io) +-  [Contact support](https://baserow.io/contact) for questions about Baserow or help with your account. + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/aaa27bdf-c432-4f0f-92b3-17ea1b82a230/Baserow%20single%20select%20field.jpg + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/1703438f-86d5-42f7-a365-513e621a9f9a/Screenshot_2022-07-14_at_09.14.46.png + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/ccc90947-b3f7-42a3-babc-a953be335ef9/Screenshot_2022-07-14_at_09.02.35.png + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/acd7afe7-74ed-433a-b4eb-f8fd242c14a9/Screenshot_2022-07-14_at_08.54.44.png + [5]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/5758a766-866a-4eb0-8511-d35df8af8115/Screenshot_2022-07-14_at_09.10.09.png + [6]: /user-docs/guide-to-kanban-view + [7]: /user-docs/multiple-select-field + [8]: /user-docs/link-to-table-field + [9]: /user-docs/filters-in-baserow + [10]: /user-docs/field-customization",,baserow_user_docs,https://baserow.io/user-docs/single-select-field +41,Multiple select field,multiple-select-field,Multiple select field in Baserow,"# Working with the Multiple select field + +The **Multiple select field** lets you easily tag records with multiple predefined, colored options from a single list. + + +This guide covers what a Multiple select field is and when to use it, how to add and configure a Multiple select field, how to create, edit, reorder, and delete options, and how to set a default value for new rows. + +![Baserow multiple select field image][1] + + +## What is a Multiple select field? + +A Multiple select field is similar to the [Single select field][2], as it allows you to choose from a list of predefined, color-coded options. The key difference is that you can select **multiple options** for a single cell, not just one. + +This field type is perfect for tasks like: +* Tagging articles (e.g., 'Marketing', 'Product', 'UX') +* Tracking features ('iOS', 'Android', 'Web') +* Assigning multiple categories to an item + +When you change an option's name or color in the field's settings, Baserow automatically updates it across all rows that use that option, ensuring your data remains consistent. + +## Add a Multiple select field + +To create a Multiple select field, [add a new field](/user-docs/adding-a-field) in your table. From the dropdown menu, select the **Multiple select** type. + +When you edit a cell in this field, an autocomplete menu will appear. You can type to filter the list or select the options you want from the dropdown. Each selected option appears as a small, colored token. You can remove an option by clicking the `x` on its token. + +## Customize multiple select options + +You can manage all options from the field configuration menu. Click the dropdown arrow next to the field's name and select **Edit field**. + +A major benefit of this field is that changes are applied everywhere. For example, if you have an option 'yellow' and decide to rename it to 'green', you only need to change it once in the settings. All rows that had the 'yellow' tag will automatically update to 'green', saving you significant time. + +### Add a multiple select option + +You can add new options in two ways: + +1. **From the field menu:** + * In the ""Edit field"" dialog, click the **+ Add an option** button. + * Type the name for your new option and press Enter. + + ![Adding a new option in the field configuration menu][4] + +2. **On-the-fly:** + * Click on a cell in the multiple select column. + * Type the name of the new option you want to create. + * Click the **+ Create new option** button that appears in the dropdown. The new option will be created and added to the cell immediately. + + ![Creating a new multiple select option directly from the cell][5] + +### Set default options + +You can set default options that will be automatically applied to new rows. + +1. Click the dropdown arrow next to the field name and select **Edit field**. +2. In the configuration dialog, locate the **Default options** section. +3. Select one or more options you want to use as the default. +4. Click **Save**. + +Any new row created in the table will now have this value pre-selected. + +### Reorder the multiple select options + +To change the order of options in the dropdown, go to the **Edit field** menu. Click and drag the reorder icon (six dots) to the left of an option's name to move it up or down the list. + +![Reordering options in the Multiple select field menu][6] + +### Delete a multiple select option + +In the **Edit field** menu, click the `x` icon to the right of any option to delete it. + +> **Note:** When you delete an option, it will be permanently removed from all cells that used it. This action cannot be undone. + +### Modify multiple select colors + +You can choose from different colors to help visually distinguish your options. In the **Edit field** menu, click the colored square next to an option's name and select a new color from the palette. + +![Changing the color of a multiple select option][7] + + + +## Frequently asked questions + +### What's the difference between a Multiple select and a Single select field? +A [Single select field][2] allows you to choose only **one** option per cell from a list. A Multiple select field allows you to choose **more than one** option for the same cell. + +### When should I use a Multiple select field? +Use a Multiple select field anytime you need to categorize or tag a record with multiple attributes. Common examples include tagging blog posts (e.g., 'SEO', 'Content Marketing'), assigning multiple features to a product ('Dark Mode', 'SSO'), or tracking skills for an employee ('Python', 'SQL', 'Project Management'). + +### What's the difference between a Multiple select and a Link-to-table field? +A Multiple select field stores a static list of text options. A [Link-to-table field][8] connects records to an *entirely different table*. If your options are simple tags (like 'High Priority'), use a multiple select. If your ""options"" are actually other database records (like 'Customers' or 'Projects'), use a link to table field. + + +## Related content +* [Single select field][2] +* [Link-to-table field][8] +* [Introduction to fields in Baserow][9] +* [Field configuration options][10] + + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we’re ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](https://baserow.io/contact) for questions about Baserow or help with your account. + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/a47794e2-574b-4186-b872-31495fec1912/Baserow%20multiple%20select%20field.jpg + [2]: /user-docs/single-select-field + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/1092a3e2-aeab-4478-bc25-f09247fd2efa/Screenshot_2022-07-14_at_09.23.34.png + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/ca98df48-be84-4b27-a98e-b557e6d4172a/Screenshot_2022-07-14_at_09.27.15.png + [5]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/6f17590f-a805-40b1-ae1c-286ddc74a4f2/Screenshot_2022-07-14_at_09.29.35.png + [6]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/4e0af774-14da-4eb8-935e-09bdd3ac4abb/Screenshot_2022-07-14_at_09.30.48.png + [7]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/00fb0a9d-ef99-4cfc-96c3-d434bcd84c31/Screenshot_2022-07-14_at_09.33.23.png + [8]: /user-docs/link-to-table-field + [9]: /user-docs/baserow-field-overview + [10]: /user-docs/field-customization",,baserow_user_docs,https://baserow.io/user-docs/multiple-select-field +42,Phone number field,phone-number-field,Phone number field in Baserow table,"# Working with the Phone number field + + +The **Phone number field** validates and formats numerical inputs, making it easy to store and use contact numbers directly from your table. + +This guide covers what a Phone number field is and its key features, how to add a Phone number field to your table, how the field validates and formats data, and how to use the field for click-to-call. + +Learn more: [Configure field types](https://baserow.io/user-docs/field-customization) + +![Adding a new phone number field in Baserow][1] + +## What is a Phone number field? + +A Phone number field is a specialized field type designed to store contact phone numbers. Unlike a standard text field, it ensures that your data is consistent, valid, and actionable. + +Its main purpose is to clean up and structure data at the point of entry. + +* **Validation:** It automatically checks that the entered value is a plausible phone number, preventing simple data entry errors. +* **Formatting:** It formats the string of numbers into a standardized, readable format (e.g., `+1 (555) 123-4567`). This keeps your database clean and easy to read. +* **Click-to-Call:** Numbers in this field become actionable links. Clicking a number in your browser or on mobile will automatically launch your device's default calling (e.g., FaceTime, Skype) or texting (e.g., iMessage) application. + +This field is essential for any table that tracks leads, contacts, user lists, or any record requiring a valid phone number. + +## Add a Phone number field + +To add a Phone number field to your table: + +1. In your table, click the plus sign `+` to [add a new field](/user-docs/adding-a-field). +2. In the dropdown menu, select **Phone number** as the field type. +3. Input a name for your field (e.g., ""Contact Phone""). +4. Click **Create**. + + + +## Using the Phone number field + +Once you've added the field, you can start entering numbers. You'll notice that as you type, Baserow formats the number for you. + +The primary benefit is the **click-to-call** functionality. Simply tap or click on the cell containing the phone number. Your browser or operating system will prompt you to open the link with your default calling or messaging app. + + + +## Frequently asked questions + +### What's the difference between a Phone number field and a text field? +A [Single line text field][34] accepts *any* combination of characters. A Phone number field is specialized: it validates that the input is a phone number and automatically formats it into a standard, consistent structure. It also makes the number a clickable `tel:` link, which a text field does not do by default. + +### What format should I use to enter a number? +The field is flexible and will do its best to interpret the number you enter. For best results and to avoid ambiguity, it's recommended to use the international format, including the country code (e.g., `+1` for the United States, `+44` for the United Kingdom). + +### Does this field validate that the phone number is real? +The field validates that the entry *is in the format* of a phone number (e.g., it has the correct number of digits). It does not, however, check if the number is currently in service or ""real."" Its purpose is to ensure data *consistency*, not to verify the number's active status. + + +## Related content +* [Email field][42] +* [URL field][41] +* [Single line text field][34] +* [Introduction to fields in Baserow][25] + +--- + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we’re ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](https://baserow.io/contact) for questions about Baserow or help with your account. + + [25]: /user-docs/baserow-field-overview + [34]: /user-docs/single-line-text-field + [41]: /user-docs/url-field + [42]: /user-docs/email-field + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/c07d7876-fa6e-47d9-82d3-2da70eb0b82a/Screenshot%25202022-07-14%2520at%252012.14.15.png",,baserow_user_docs,https://baserow.io/user-docs/phone-number-field +43,Link to table field,link-to-table-field,Link to table field in Baserow,"# Working with the Link-to-table field + +The **Link-to-table field** is the most powerful way to create relationships between tables, allowing you to connect records and look up information from other tables. + +This guide covers what a Link-to-table field is and why you'd use it, how to create a Link-to-table field, how to link and unlink records, key customization options, like one-to-one relationships and limiting selection to a view, and how to use the row select modal. + +Learn more: [Configure field types](https://baserow.io/user-docs/field-customization) + +> **Note:** A Link-to-table field cannot be set as the [primary field][33] of a table. + +![Creating a new Link-to-table field and selecting the target table][3] + +## What is a Link-to-table field? + +A Link-to-table field creates a dynamic connection between a row in one table and one or more rows in another table (or even the same table). This allows you to build sophisticated relational databases and avoid redundant, out-of-sync data. + +For example, you could have a **Customers** table and an **Orders** table. Instead of re-typing the customer's name and email in the **Orders** table for every order, you can use a Link-to-table field to link each order to the correct record in the **Customers** table. + +This allows you to: +* Easily see all orders for a specific customer. +* Use [Lookup][48] and [Rollup][51] fields to pull customer information (like email) into the **Orders** table automatically. +* Change a customer's name in the **Customers** table once, and it will be updated everywhere it's linked. + + + + + +## How to create a Link-to-table field + +1. In your table, click the plus sign `+` to [add a new field](/user-docs/adding-a-field). +2. Select **Link-to-table** from the field type dropdown menu. +3. From the **Select a table to link to** dropdown, choose the table you want to establish a relationship with. +4. Click **Create**. + +Baserow will automatically create the link. You will also see a new corresponding field in the table you linked to, showing which rows are connected back to this one. + + + +## How to link and unlink rows + +Once the field is created, you can start linking records: + +1. Click the **+** button inside a cell in the Link-to-table column. +2. This will open the **row select modal**, which shows a list of all rows from the linked table. +3. Click on one or more rows to select them. The modal will close, and the selected rows will appear as colored tokens in the cell. + +**To unlink a row**, simply click the `x` on the token of the row you wish to remove. + +![Unlinking a row by clicking the 'x' on its token][11] + + + +## Field customization options + +You can configure your Link-to-table field to control how many relationships are allowed and what options are available to select. Learn more: [Field configuration options][27] + +### Control related field creation (one-way linking) + +When you create a Link-to-table field, Baserow's default behavior is to create a *reciprocal field* in the linked table. This creates a **two-way link**, which is standard for most relational databases. + +You can now control this behavior. In the field creation or edit menu, you will see a checkbox: `[x]` **Create related field in linked table** + +#### Checked (Default) +This creates the standard **two-way link**. Linking `Tasks` to `Projects` will create a ""Tasks"" link field in the `Projects` table. This is the recommended setting for most use cases, as it allows you to see the relationship from both tables and use [Lookups][48] or [Rollups][51] in either direction. + +#### Unchecked (One-Way Link) +If you uncheck this box, Baserow will *only* create the link field in the current table (e.g., the ""Projects"" field in `Tasks`). The linked `Projects` table will **not** get a new ""Tasks"" field. + +This is useful for preventing clutter in central ""lookup"" tables. For example, if you have 10 different tables (Tasks, Issues, Documents, etc.) that all link to a single `Categories` table, you can uncheck this box to avoid cluttering the `Categories` table with 10 different reciprocal link fields. + +> Creating a one-way link means you cannot easily see the relationship from the linked table. You also cannot add a [Lookup][48] or [Rollup][51] field in the `Projects` table to pull data from `Tasks`, because the necessary link field does not exist there. + +![Configuring a one-to-one relationship by unchecking 'Allow multiple selection'][7] + +### One-to-one relationships + +By default, a Link-to-table field allows you to link *multiple* rows (a ""many-to-many"" relationship). You can restrict this to a ""one-to-one"" relationship by unchecking the **Allow multiple relationships** box during field setup or by editing the field later. + +This is useful when your data model requires a single link, such as linking one ""Project"" to one ""Project Manager."" + + +### Limit selection to a view + +You can control which rows are available to be linked by restricting the selection to a [specific view][63]. This is perfect for ensuring users only choose relevant, pre-filtered data. + +1. Click the dropdown arrow next to the field name and select **Edit field**. +2. Locate the **Limit selection to view** option. +3. Click the dropdown and choose the specific view you want to use for selecting rows. + +![Limiting the selectable rows in a Link-to-table field to a specific view][17] + +### Self-referencing links + +You can link a table to itself. This is a powerful feature for use cases like: +* Linking ""Tasks"" to ""Sub-tasks"" within the same table. +* Building an organizational chart by linking ""Employees"" to their ""Managers."" + +To do this, simply select the *same table* you are currently in from the **Select a table to link to** dropdown during setup. + +## Using the row select modal + +The row select modal is a powerful tool for finding and managing your linked records. + +### Create new rows on the fly + +If the record you want to link doesn't exist yet, you can create it directly from the modal. Click the **+** button at the bottom of the modal to create a new row in the linked table, which will then be automatically linked. + +![Creating a new row directly from the row select modal][9] + +### Customize modal fields + +You can customize the modal to show the most relevant information. Click the **""...""** icon (or ""Hide fields"" button) in the modal to adjust field widths, hide non-essential fields, and reorder fields. + +![Customizing visible fields and their order within the row select modal][10] + +### Search and navigate + +If the linked table has many rows, you can use the search bar at the top of the modal to instantly find the record you're looking for. If there are more than 10 rows, navigation arrows will appear. + +![Searching for a specific row within the row select modal][6] + + + +## Related features + +### Enlarge linked rows + +If you click on a linked row's token, an [enlarged view][80] (or ""row detail modal"") of that row will open. This allows you to see all the details of the linked record without leaving your current table. You can even click on links within *that* modal to stack multiple enlarged views. + +### Convert an existing field + +You can change an existing field (like a text field) into a Link-to-table field. + +> **Warning:** This action may **delete all data** currently in that field. Make sure to back up your data (e.g., by duplicating the field) before proceeding. + +To convert a field, click the dropdown, select **Edit field**, and change the field type to **Link to table**. You will then be prompted to select the table to link to. + + + +## Frequently asked questions + +### What's the difference between a Link-to-table and a Multiple select field? +A [Multiple select field][45] stores a static list of *text options* that you define. A Link-to-table field connects to *other records* in another table. Use a multiple select for simple, unchanging tags (e.g., 'Priority: High'). Use a Link-to-table when your ""options"" are actually data records themselves (e.g., 'Customer: John Smith'). + +### What's the difference between a Link-to-table, Lookup, and Rollup field? +You must create a **Link-to-table field first**. A [Lookup field][48] and a [Rollup field][51] *use* that link to pull data from the linked records. +* **Link-to-table:** Creates the relationship (e.g., links an ""Order"" to a ""Customer""). +* **Lookup:** ""Looks up"" and displays a specific field from the linked record (e.g., show the ""Customer's Email"" in the ""Orders"" table). +* **Rollup:** Performs a calculation on the linked records (e.g., show the ""Total Spent"" for that ""Customer""). + +### When I link Table A to Table B, what happens in Table B? +When you create a Link-to-table field in Table A that points to Table B, Baserow automatically creates a corresponding link field in Table B if you select ""**Create related field in linked table**"". This new field shows which rows in Table A are ""linking back"" to each record in Table B, ensuring the relationship is visible and accessible from both tables. + +### What happens if I delete a row that is linked by other tables? +If you delete a row (e.g., you delete a ""Customer"" record), all links to that specific row in other tables (e.g., in your ""Orders"" table) will be automatically removed. The link tokens will simply disappear from the cells, as the record they were pointing to no longer exists. + +### Can I link multiple different tables to a single table? +Yes. You are not limited to a single link. For example, your ""Tasks"" table could have one Link-to-table field connecting to ""Users"" (for the assignee) and a second Link-to-table field connecting to ""Projects"" (for the project). You can add as many Link-to-table fields as you need. + +## Related content +* [Lookup field][48] +* [Rollup field][51] +* [Count field][50] +* [Enlarging rows][80] +* [Field configuration options][27] + +--- + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account. + + + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/19ca35b2-aa33-4e32-ace1-0e5a5fc87d67/Screenshot_2022-07-15_at_18.58.43.png + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/b496d592-43c6-4210-a73e-2c96c1215429/Screenshot_2022-07-15_at_19.23.52.png + [6]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/04d8d01a-9622-41b1-bb79-c69471eee2d5/Screenshot_2022-07-15_at_19.30.26.png + [7]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/31f8ac3c-3992-4b1e-8f61-3ef6c5d4c773/one-to-one%20relationship.jpg + [9]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/3a18a71a-9b51-4c2f-8167-de6017bac007/Untitled(26).png + [10]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/b5680ce5-2dc0-4dab-8d95-421c4e843c06/row_select_modal_improvements.webp + [11]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/c631f5ea-4700-4fc2-ab23-26130dd6bf7c/Screenshot_2022-07-15_at_19.33.34.png + [13]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/11a315d8-f936-4496-9b3e-b680e4b9c7a/Screenshot_2022-07-15_at_19.42.31.png + [17]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/e7cedf1f-d0e6-4291-96e7-8eaa05e05a1f/Link%20to%20table%20field%20limit%20selection.png + [27]: /user-docs/field-customization + [33]: /user-docs/primary-field + [45]: /user-docs/multiple-select-field + [48]: /user-docs/lookup-field + [50]: /user-docs/count-field + [51]: /user-docs/rollup-field + [63]: /user-docs/overview-of-baserow-views + [80]: /user-docs/enlarging-rows",,baserow_user_docs,https://baserow.io/user-docs/link-to-table-field +44,Lookup field,lookup-field,Lookup field in Baserow,"# Working with the Lookup field + +The **Lookup field** automatically pulls and displays specific information from a linked record, allowing you to see data from another table in one place. + +This guide covers what a Lookup field is and its ""read-only"" nature, the prerequisite for creating a Lookup field, how to create a Lookup field, and how to sort and filter by a Lookup field. + + + + +## What is a Lookup field? + +A Lookup field works *after* you have already set up a [Link-to-table field][3]. While the **link field** *connects* the records, the **Lookup field** *pulls in and displays* specific data from those linked records. + +A key feature of Lookup fields is that they are **read-only**. You cannot edit the data in a Lookup field directly. To change the value, you must go to the original record (e.g., by clicking the link in the Link-to-table field) and edit the data in its source cell. + +> Learn more about description, filtering and sorting by a Lookup field: [Configure field types](https://baserow.io/user-docs/field-customization) + +## How to create a Lookup field + +### Prerequisite +You must have an existing [Link-to-table field][3] in your table before you can create a Lookup field. + +### Steps +1. In your table, click the plus sign `+` to [add a new field](/user-docs/adding-a-field). +2. Select **Lookup** from the field type dropdown menu. +3. In the configuration box, you must select two things: + * **Select a link row field:** Choose the [Link-to-table field][3] you want to use for the lookup. + * **Select a field to lookup:** Choose the specific field *from the other table* that you want to display. +4. Click **Create**. +![Creating a Lookup field in Baserow][1] + + +The new read-only field will now be populated with the data from the linked records. + + +### Example: Customers and Orders + +This field is the perfect way to avoid re-typing data and reduce errors. Imagine you have two tables: + +1. **Customers**: Contains `Customer Name`, `Email`, and `Address`. +2. **Orders**: Contains `Order ID`, `Order Date`, and a [Link-to-table field][3] called `[Link] Customer`. + +**Goal:** You want to see the customer's `Email` and `Address` in the **Orders** table without manually copying and pasting it. + +**Solution:** +In your **Orders** table, you would create two **Lookup fields**: +* **Lookup 1 (Email):** This field ""looks at"" the `[Link] Customer` field and ""pulls"" the `Email` field. +* **Lookup 2 (Address):** This field also ""looks at"" the `[Link] Customer` field and ""pulls"" the `Address` field. + +Now, when you link an order to a customer, their email and address will automatically appear in your **Orders** table. If you update the customer's address in the **Customers** table, it automatically updates in the **Orders** table. + +## Frequently asked questions + +### What's the difference between a Link-to-table, Lookup, and Rollup field? +This is a common question. They all work together: +* **[Link to Table][3]:** This is the first step. It *creates the relationship* between records in different tables (e.g., links an `Order` to a `Customer`). +* **Lookup:** This *displays* a specific piece of data from the linked record (e.g., shows the `Customer's Email`). It is read-only. +* **[Rollup][5]:** This *performs a calculation* on the linked records (e.g., *counts* the number of orders for a customer or *sums* their total spent). + +### Why can't I edit a Lookup field? +Lookup fields are **read-only** by design. They are simply a ""window"" that displays data from another table. To change the value in a Lookup field, you must edit the *original* data in the linked record. + +### Can I look up a value from another Lookup field? +Yes. If Table B has a Lookup field pulling data from Table C, your Table A can link to Table B and look up the value from that Lookup field. You can chain lookups together. + + + +## Related content +* [Link-to-table field][3] +* [Rollup field][5] +* [Count field][6] +* [Introduction to fields in Baserow][7] + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account. + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/95c0b143-0209-4839-826d-a8e9b029c8d2/Baserow%20lookup%20field.jpg + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/5b260e48-458f-46f0-9094-94c6a53a09b9/Screenshot_2022-07-15_at_19.55.19.png + [3]: /user-docs/link-to-table-field + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/2d7af812-dd05-4876-a51c-c6aad194b590/Screenshot_2022-07-14_at_07.36.11.png + [5]: /user-docs/rollup-field + [6]: /user-docs/count-field + [7]: /user-docs/baserow-field-overview",,baserow_user_docs,https://baserow.io/user-docs/lookup-field +45,Formula field reference,understanding-formulas,Baserow Formula field reference guide,"# Formula field reference + +Access Baserow's complete formula function library and learn common formula patterns for calculations, text manipulation, date operations, and logical conditions. + +This reference guide helps you build powerful formulas in Baserow. For a general introduction to formulas, see the [Formula field overview](/user-docs/formula-field-overview). + + + +## Using the formula reference + +Baserow formulas support multiple field types, including [Duration fields](/user-docs/duration-field) and [Multiple select fields](/user-docs/multiple-select-field). You can perform mathematical operations, text manipulation, date calculations, and logical comparisons across your data. + +### Finding functions + +The formula editor in Baserow includes built-in autocomplete and function suggestions. As you type, relevant functions appear with syntax hints and examples. + +**To explore available functions:** +1. Create or edit a Formula field +2. Start typing in the formula editor +3. Browse suggested functions with descriptions +4. Click on a function to see syntax and examples + +## Working with complex field types + +### Multiple select fields + +Formulas work with [Multiple select fields](/user-docs/multiple-select-field) to check which options are selected and perform operations on that data. + +![Multiple select support in formula fields](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/dd98fe74-d278-4708-b303-11420060fe5c/Multiple%20select%20support%20in%20the%20formula%20field%20type.png) + +### Link to table fields + +When working with [Link-to-table fields](/user-docs/link-to-table-field), use `lookup()` to access fields from linked records, then apply aggregation functions like `sum()`, `count()`, or `join()`. + +### Lookup and Rollup fields + +[Lookup fields](/user-docs/lookup-field) and [Rollup fields](/user-docs/rollup-field) return arrays. Convert them to single values using aggregation functions before using them in conditions or comparisons. + +## Common formula patterns + +These examples demonstrate frequently used formula patterns. Replace field names with your own table fields. + +### Calculations and math + +**Calculate total price:** +``` +field('Quantity') * field('Unit Price') +``` + +**Apply percentage discount:** +``` +field('Price') * (1 - field('Discount Percent') / 100) +``` + +**Round to 2 decimal places:** +``` +round(field('Amount'), 2) +``` + +**Find the greater value:** +``` +greatest(field('Value A'), field('Value B')) +``` + +### Text operations + +**Combine first and last name:** +``` +concat(field('First Name'), ' ', field('Last Name')) +``` + +**Convert to uppercase:** +``` +upper(field('Product Code')) +``` + +**Extract first 10 characters:** +``` +left(field('Description'), 10) +``` + +**Check if text contains a word:** +``` +contains(field('Notes'), 'urgent') +``` + +### Date and time + +**Calculate days between dates:** +``` +date_diff('day', field('Start Date'), field('End Date')) +``` + +**Format date as text:** +``` +datetime_format(field('Created'), 'YYYY-MM-DD') +``` + +**Check if date is in the past:** +``` +field('Due Date') < today() +``` + +**Get the year from a date:** +``` +year(field('Date Field')) +``` + +### Conditional logic + +**Display different text based on status:** +``` +if(field('Status') = 'Complete', '✓ Done', '⧗ Pending') +``` + +**Use default value when field is empty:** +``` +when_empty(field('Notes'), 'No notes added') +``` + +**Combine multiple conditions:** +``` +if(and(field('Quantity') > 0, field('Price') > 100), 'In Stock - Premium', 'Standard') +``` + +### Working with linked tables + +**Sum values from linked records:** +``` +sum(lookup('Orders', 'Total')) +``` + +**Count linked items:** +``` +count(field('Related Items')) +``` + +**Join text from multiple records:** +``` +join(lookup('Projects', 'Name'), ', ') +``` + +**Filter and sum:** +``` +sum(filter(lookup('Items', 'Price'), lookup('Items', 'Status') = 'Active')) +``` + +### Creating interactive buttons + +**Create a clickable button:** +``` +button('https://example.com/' + field('ID'), 'View Details') +``` + +**Link to email address:** +``` +link('mailto:' + field('Email')) +``` + +![Formula buttons in Baserow](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/81b52ee9-8b60-4bab-a546-f9241f641d60/Untitled.png) + +## Frequently asked questions + +### How do I reference other fields in formulas? + +Use the `field()` function with the exact field name in single quotes: `field('Field Name')`. Field names are case-sensitive and must match exactly. + +### Why isn't my formula working with Lookup or Link-to-table fields? + +Lookup and Link-to-table fields contain arrays (multiple values), not single values. Most functions expect single values. Use aggregation functions like `sum()`, `join()`, `count()`, or `avg()` to convert arrays into single values. + +**Example problem:** +``` +isblank(field('Organization')) // Won't work if Organization is a link field +``` + +**Solution:** +``` +isblank(join(field('Organization'), '')) // Converts array to text first +``` + +### Can I use formulas with Duration fields? + +Yes. Duration fields support mathematical operations directly. You can add, subtract, multiply, and divide duration values just like numbers. Learn more about [Duration fields](/user-docs/duration-field). + +### How do I check if a date is a specific day of the week? + +Use `datetime_format()` with the 'D' format code, where Sunday = 1, Monday = 2, etc: +``` +datetime_format(field('Date Field'), 'D') = '1' // Returns true if Sunday +``` + +For more date formatting options, see the [PostgreSQL formatting documentation](https://www.postgresql.org/docs/current/functions-formatting.html). + +### Do the today() and now() functions update automatically? + +Yes. Both functions update every 10 minutes. Use `today()` for the current date only, and `now()` when you need both date and time. + +### How do I handle empty or null values in formulas? + +Use `when_empty()` to provide fallback values, or `isblank()` to check if a field is empty: +``` +when_empty(field('Optional Field'), 'Default Value') +``` +``` +if(isblank(field('Name')), 'No name provided', field('Name')) +``` + +### Can I use regular expressions in formulas? + +Yes. Use `regex_replace()` to find and replace text patterns: +``` +regex_replace(field('Phone'), '[^0-9]', '') // Removes non-numeric characters +``` + + +## Related resources + +### Documentation +- [Formula field overview](/user-docs/formula-field-overview) - Introduction to Formula fields +- [Generate formulas with Baserow AI](/user-docs/generate-formulas-with-baserow-ai) - Let AI write formulas for you +- [Understanding Baserow formulas](/docs/tutorials/understanding-baserow-formulas) - Step-by-step tutorial +- [Working with timezones](/user-docs/working-with-timezones) - Date formula timezone handling + +### Technical guides +- [Understanding Baserow Formulas](/docs/tutorials%2Funderstanding-baserow-formulas) - What Baserow formulas are and how to use them +- [Technical formula implementation](/docs/technical/formula-technical-guide) - How formulas work internally + +### Related field types +- [Link to table field](/user-docs/link-to-table-field) - Connect tables for formulas +- [Lookup field](/user-docs/lookup-field) - Pull data from linked records +- [Rollup field](/user-docs/rollup-field) - Aggregate linked record data +- [Duration field](/user-docs/duration-field) - Time-based calculations + +--- + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account",,baserow_user_docs,https://baserow.io/user-docs/understanding-formulas +46,API documentation,database-api,Baserow Database API documentation,"# Database API documentation + +Baserow's API-first approach makes it easy to integrate databases with any application, automate workflows, and build custom solutions without vendor lock-in. + +Baserow provides REST APIs for all database operations using [token-based authentication][1]. Access auto-generated docs through your database settings, authenticate with tokens, and use standard HTTP methods for CRUD operations on tables and rows. + +![Baserow Database API documentation][2] + +## Overview + +Baserow automatically generates REST API documentation for every database you create. The API follows REST conventions, uses JSON for data exchange, and provides standard HTTP status codes for clear error handling. + +Authentication uses [database tokens][1] with granular permissions down to the table level. You can control create, read, update, and delete access per token, ensuring secure integration with external applications. + +The API documentation updates automatically when you modify your database schema, keeping your integration code in sync with your data structure changes. + +## Access database API documentation + +1. Click the vertical ellipsis `⋮` next to your database name +2. Select **View API Docs** from the menu +3. Review auto-generated endpoints specific to your schema +4. Make your first API call + +``` +curl \ +-X GET \ +-H ""Authorization: Token YOUR_DATABASE_TOKEN"" \ +""https://api.baserow.io/api/database/fields/table/TABLE_ID/"" +``` + +Learn how to [generate a database token for a workspace][1]. + +## Core API endpoints + +Test endpoints with tools like curl or Postman. + +| Operation | Method | Endpoint | Description | +|-----------|--------|----------|-------------| +| **List tables** | `GET` | `/api/database/tables/all-tables/` | Get all tables in workspace | +| **List fields** | `GET` | `/api/database/fields/table/{table_id}/` | Get field schema for table | +| **List rows** | `GET` | `/api/database/rows/table/{table_id}/` | Get all rows with filtering/pagination | +| **Get row** | `GET` | `/api/database/rows/table/{table_id}/{row_id}/` | Get specific row by ID | +| **Create row** | `POST` | `/api/database/rows/table/{table_id}/` | Add new row to table | +| **Update row** | `PATCH` | `/api/database/rows/table/{table_id}/{row_id}/` | Modify existing row | +| **Move row** | `PATCH` | `/api/database/rows/table/{table_id}/{row_id}/move/` | Change row position | +| **Delete row** | `DELETE` | `/api/database/rows/table/{table_id}/{row_id}/` | Remove row from table | + +## Authentication + +Baserow uses [token authentication][1] for API access. Tokens are scoped to specific databases and tables. Permissions can be set to create, read, update, delete per table. Use specific table permissions rather than full database access. + +All API requests must use HTTPS and must include the database token in the Authorization header. + +``` +Authorization: Token YOUR_DATABASE_TOKEN +``` + + Tokens can be revoked at any time from the account settings. + +> Store tokens securely and rotate regularly (environment variables, not in code). + +## Rate limits + +Monitor rate limits, API usage and performance on cloud instances. + +**Cloud version**: In Baserow Cloud, there's a limit of 10 concurrent API requests. This limit is subject to a fair use policy, and we reserve the right to lower it if it affects overall performance. +**Self-hosted**: No rate limits + +## Working with field types + +Different field types require specific data formats when creating or updating rows. + +### Text and numeric fields +```json +{ + ""Name"": ""John Doe"", + ""Age"": 25, + ""Email"": ""john@example.com"" +} +``` + +### Select fields +Provide either the option names or internal IDs: + +**Single select:** + +Accepts an integer or a text value representing the chosen select option ID or option value. A null value means none is selected. In case of a text value, the first matching option is selected. + +```json +{ + ""Timezone"": { + ""id"": 1, + ""value"": ""Option"", + ""color"": ""light-blue"" + } +} +``` + +**Multiple select:** + +Accepts an array of mixed integers or text values, each representing the chosen select option ID or value. In case of a text value, the first matching option is selected. You can send a string with names separated by a comma as a value, in which case the string is converted into an array of option names. + +```json +{ + ""Team"": [ + { + ""id"": 1, + ""value"": ""Option"", + ""color"": ""light-blue"" + } + ] +} +``` + +### Link to table fields + +Accepts an array containing the identifiers or main field text values of the related rows from the table ID. All identifiers must be provided every time the relations are updated. If an empty array is provided, all relations will be deleted. In case of a text value instead of an identifier, a row with the matching value for its main field will be searched. If more than one match is found, the first one in the order of the table is selected. You can send a string with names separated by a comma, in which case the string is converted into an array of row names. You can also send only the ID of a row alone. + +Reference related rows by primary field value or ID: +```json +{ + ""Customer"": [ + { + ""id"": 0, + ""value"": ""string"" + } + ] +} +``` + +### Date and boolean fields +```json +{ + ""Created"": ""2024-01-15T10:30:00Z"", + ""IsActive"": true +} +``` + +## Error handling + +Baserow uses standard HTTP status codes with detailed error messages. Implement proper error handling and retry logic in your application. + +Common status codes: +| Error code | Name | Description | +|------------|--------------------------|---------------------------------------------------------------------| +| 200 | Ok | Request completed successfully. | +| 400 | Bad request | The request contains invalid values or the JSON could not be parsed.| +| 401 | Unauthorized | When you try to access an endpoint without a valid database token. | +| 404 | Not found | Row or table is not found. | +| 413 | Request Entity Too Large | The request exceeded the maximum allowed payload size. | +| 500 | Internal Server Error | The server encountered an unexpected condition. | +| 502 | Bad gateway | Baserow is restarting or an unexpected outage is in progress. | +| 503 | Service unavailable | The server could not process your request in time. | + + +Error response format +```json +{ + ""error"": ""ERROR_NO_PERMISSION_TO_TABLE"", + ""description"": ""The token does not have permissions to the table."" +} +``` + +## Filtering and pagination + +Query parameters for listing rows + +**Filtering:** +- `filters`: JSON object with filter conditions. Rows can optionally be filtered using the same view filters that are available for the views. +- `filter_type`: ""AND"" or ""OR"" for multiple filters. This works only if two or more filters are provided. +- `search`: Full-text search across all fields. If provided, only rows with data that matches the search query are going to be returned. + +**Sorting:** +- `order_by`: Field name to sort by. By default or if prepended with a '+', a field is ordered in ascending (A-Z) order, but by prepending the field with a '-', it can be ordered descending (Z-A). + +**Pagination:** +Use pagination for large datasets. +- `size`: Number of rows per page (default 100, max 200) +- `page`: Page number (starts at 1) + + +```bash +GET /api/database/rows/table/123/?filters={""Status"":""Active""}&order_by=-Created&size=50&page=2 +``` + +## OpenAPI specification + +The OpenAPI spec includes detailed parameter descriptions, request/response examples, and can be imported into API testing tools like Postman or Insomnia. + +Access the complete API specification: +- **Interactive docs**: [https://api.baserow.io/api/redoc/](https://api.baserow.io/api/redoc/) +- **JSON schema**: [https://api.baserow.io/api/schema.json](https://api.baserow.io/api/schema.json) + +## Webhooks integration + +Combine API calls with webhooks for real-time data synchronization. + +Webhooks notify your application when data changes. API calls let you query and update data programmatically. Together, they enable bi-directional integration workflows. + +[Learn more about Baserow webhooks](/user-docs/webhooks) + +## Frequently asked questions + +### How do I find my table and database IDs? + +Table and database IDs are visible in your browser URL when viewing a table, or you can retrieve them via the list tables endpoint. [Learn more about finding IDs](/user-docs/database-and-table-id). + +### Can I use the API without creating an account? + +No, all API endpoints require authentication with a database token, which requires a Baserow account and access to the relevant database. + +### What happens when I change my database schema? + +The API documentation automatically updates to reflect your schema changes. However, you may need to update your client code if field names, types, or table structures change. Cache table schema information when possible. + +### How do I handle API rate limits? + +Cloud users should implement retry logic with exponential backoff. Self-hosted instances have no rate limits. Monitor response headers for rate limit status. + +### Can I bulk create or update multiple rows? + +The standard API creates/updates one row per request. For bulk operations, make multiple API calls or consider using the batch endpoints if available in your plan. + +### How do I debug API authentication issues? + +Verify your token is correct, has proper permissions for the table, and is included in the Authorization header as `Token YOUR_DATABASE_TOKEN`. Check that your database and table IDs are accurate. + +## Related content + +- [Generate database tokens](/user-docs/personal-api-tokens) +- [Database and table IDs guide](/user-docs/database-and-table-id) +- [Baserow webhooks](/user-docs/webhooks) +- [Zapier integration](/user-docs/zapier): No-code automation platform +- [Make integration](/user-docs/make): Visual workflow builder +- [n8n integration](/user-docs/n8n): Open-source workflow automation + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](https://baserow.io/contact) for questions about Baserow or help with your account. + + + [1]: https://baserow.io/user-docs/personal-api-tokens + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/ca8aec4c-101d-436c-8878-571f37e02cc4/API%20doc.jpg",,baserow_user_docs,https://baserow.io/user-docs/database-api +47,Views overview,overview-of-baserow-views,Baserow views overview,"# Views overview – Manage and customize your data + +Views are different ways to display and work with your table data. Each view shows the same underlying data but optimized for different tasks and workflows. + +This guide covers how Baserow views let you visualize and interact with the same data in multiple ways; from spreadsheet grids to kanban boards, forms, and calendars. + +## What are views? + +Views let you see the same table data in different formats without duplicating information. Create a Grid view for data entry, a kanban board for project tracking, a form for data collection, and a gallery for visual browsing; all from the same table. + +When you change data in any view, that change appears in all other views because they all reference the same underlying records. Views are table-specific and don't carry across different tables or databases. + + + +## How views work + +Every table starts with a default Grid view that displays data in rows and columns like a spreadsheet. You can create additional views to show this data in different formats, each optimized for specific use cases. + +**Key principles:** +- **Same data, different displays** - All views access the same table records +- **Changes sync everywhere** - Editing a record in one view updates all views +- **Independent configurations** - Each view has its own filters, sorts, and settings +- **View-specific visibility** - Use [filters](/user-docs/view-customization) to control which records appear in each view + +Unlike traditional spreadsheets where everyone sees the same layout, Baserow lets each team member create personalized views. Your filtered, sorted kanban board doesn't affect someone else's gallery view of the same data. + +## Available view types + +Baserow offers different view types, each designed for specific workflows. Learn more about [creating custom views](/user-docs/create-custom-views-of-your-data). + +| View type | Best for | Key features | +|-----------|----------|--------------| +| **[Grid](/user-docs/guide-to-grid-view) (Default)** | Data entry, bulk editing, spreadsheet-style work | Rows and columns, inline editing, cell formatting | +| **[Gallery](/user-docs/guide-to-gallery-view)** | Visual content, images, portfolios | Card-based display, image previews, cover images | +| **[Form](/user-docs/guide-to-creating-forms-in-baserow)** | Data collection, surveys, public submissions | Shareable links, field validation, submission tracking | +| **[Kanban](/user-docs/guide-to-kanban-view)** | Project management, status tracking, workflows | Drag-and-drop cards, status columns, visual pipeline | +| **[Calendar](/user-docs/guide-to-calendar-view)** | Event scheduling, deadline tracking, time-based data | Date-based display, day/week/month views, drag-to-reschedule | +| **[Timeline](/user-docs/guide-to-timeline-view)** | Project planning, date ranges, Gantt-style tracking | Start/end dates, duration bars, timeline visualization | + +## Creating and managing views + +Learn more about [creating custom views](/user-docs/create-custom-views-of-your-data). + + +### Switch between views + +The current view tab in the table's upper left corner helps in navigating all of the table's views. You can switch between different view types in a table by clicking the view switcher in the upper left corner. + + 1. Click the View switcher dropdown at the top of the table to see all available views for the current table. + 2. Select any view from the list in the upper section + 3. You can also search for existing views by name. + 4. Then click on the view to switch to the target view. + +![Switching between views in Baserow](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/a2ffbd1a-9059-49a2-87ba-1d621830b6ec/Switch%20view.webp) + +The view dropdown shows all collaborative views and your personal views. Other users' personal views won't appear in your list. + +### Search existing views + +If you created a lot of views in your table, it might be helpful to locate a view by name. Existing views can be found by searching for them using the views search bar. + +1. Click the View switcher dropdown at the top of the table +2. Enter a search string in the ‘**Search views**’ field to locate a view. You can enter a search term to see a list of all views that match. +3. Results filter in real-time as you type. +4. Select the view to navigate to + +Search works across both collaborative and personal views that you have access to. + +![Search for existing views in Baserow](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/027084d14cbfd67c97bd15cb4891ed1ffaf5ab03.webp) + +### Customize view settings + +Each view has independent [configuration options](/user-docs/view-customization) including: +- **Filters** - Show only records matching specific conditions +- **Sorts** - Order records by field values +- **Field visibility** - Hide or show specific columns +- **[Grouping][2]** - Group records by field values (grid view) +- **Colors** - Apply conditional formatting based on data + +![View permissions allow all members to create and modify views][3] + +## Collaborative vs personal views + +Baserow offers two types of views: + +**[Collaborative views](/user-docs/collaborative-views)** are shared with all workspace members. Everyone sees the same view configuration, making them ideal for team dashboards and shared workflows. + +**[Personal views](/user-docs/personal-views)** are private to individual users. Create custom views with your preferred filters and sorts without affecting others' views. + +## Frequently asked questions + +### Do data changes in one view affect other views? + +Yes. All views display the same underlying data. If you edit a record in Grid view, that change immediately appears in Gallery view, Kanban view, and all other views of that table. However, view-specific settings like filters and sorts are independent. + +### Can I filter different records in each view? + +Yes. Each view has independent filters. Your Grid view might show all records, while your Kanban view filters to show only active projects. Filters control visibility; they don't change the actual data. + +### How many views can I create per table? + +There's no limit to the number of views per table. Create as many views as you need for different workflows, team members, or use cases. However, views only exist within their table and don't transfer to other tables or databases. + +### What's the difference between collaborative and personal views? + +[Collaborative views](/user-docs/collaborative-views) are shared with all workspace members who have access to the table. [Personal views](/user-docs/personal-views) are private to you and don't appear in other users' view lists. Personal views are perfect for custom filters or sorts you use frequently. + +### Can I import data directly into a specific view? + +When you [import data](/user-docs/import-data-into-an-existing-table) (CSV, JSON, or XML files), it's added to the table itself, not to a specific view. Once imported, the data appears in all views, subject to each view's filter settings. + +### Do views work across multiple tables? + +No. Views are table-specific. Each view displays and filters records from a single table only. To combine data from multiple tables, use [Link-to-table fields](/user-docs/link-to-table-field) and [Lookup fields](/user-docs/lookup-field) within your table, then create views of that combined data. + +## Related content + +### Getting started +- [Create custom views of your data](/user-docs/create-custom-views-of-your-data) - Step-by-step guide +- [View configuration options](/user-docs/view-customization) - Filters, sorts, and settings +- [Collaborative views](/user-docs/collaborative-views) - Shared team views +- [Personal views](/user-docs/personal-views) - Private, individual views + +### View types +- [Grid view guide](/user-docs/guide-to-grid-view) - Spreadsheet-style interface +- [Gallery view guide](/user-docs/guide-to-gallery-view) - Visual card display +- [Form view guide](/user-docs/guide-to-creating-forms-in-baserow) - Data collection +- [Kanban view guide](/user-docs/guide-to-kanban-view) - Project boards +- [Calendar view guide](/user-docs/guide-to-calendar-view) - Event scheduling +- [Timeline view guide](/user-docs/guide-to-timeline-view) - Gantt-style planning + +### Related features +- [Export a view](/user-docs/export-a-view) - Download view data +- [Import data](/user-docs/import-data-into-an-existing-table) - Add records to tables +- [Link-to-table fields](/user-docs/link-to-table-field) - Connect related data + +--- + + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/52f03c5a-abc4-4eb1-8687-4db83ae1fcc5/kanban_view.png + [2]: https://baserow.io/user-docs/group-rows-in-baserow + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/0b85a937-a728-4b7d-a887-167c31dfff9e/View%20permissions%20allow%20all%20members%20to%20create%20and%20modify%20views.jpg",,baserow_user_docs,https://baserow.io/user-docs/overview-of-baserow-views +48,Create a table,create-a-table,How to create a table in Baserow database,"# Create a table in Baserow + +Baserow makes table creation flexible; choose the approach that saves you the most time. + +Learn three ways to create tables; start from scratch, duplicate existing tables, or import from external files. Choose the method that matches your workflow and get organizing fast. + + +## Overview + +Tables are where your data lives in Baserow. Creating a new table takes seconds, whether you're starting fresh, copying an existing structure, or importing from CSV, Excel, JSON, or XML. Each method suits different scenarios; blank tables for custom projects, duplication for consistency, and imports for migrating existing data. + + + + + +## Ways to create tables + +| Method | Best for | Starting point | +|--------|----------|---------------| +| **New blank table** | Custom projects with unique needs | Empty table with default fields | +| **Duplicate existing** | Replicating proven structures | Copy of table structure and data | +| **Import from file** | Migrating spreadsheet data | Your existing CSV/Excel/JSON/XML | + + + +### Method 1: Create a blank table + +Start with an empty table when building custom structures from scratch. This gives you complete control over field types and organization. + +**Step-by-step instructions** + +1. Click on a [database](/user-docs/intro-to-databases) in the sidebar +2. Click **+ New table** at the bottom of the table list +3. Enter a descriptive name for your table (e.g., ""Customers,"" ""Tasks,"" ""Inventory"") +4. Select **Start with a new table** +5. Click **Add table**. You get a new table with default fields and sample rows to help you get started. + +After creating your table, start by adding fields. Choose from over [25 field types](/user-docs/baserow-field-overview) such as text, number, date, or file. You can also configure field properties like validation rules and default values to match your needs. + +Next, add your data to rows, [paste data from spreadsheets](/user-docs/paste-data-into-baserow-table) for quick bulk entry, or create [forms](/user-docs/guide-to-creating-forms-in-baserow) to collect information directly from others. + +Finally, organize your view to make your data easier to understand. Use [sorting and filtering](/user-docs/filters-in-baserow) to focus on specific records, [color-code rows](/user-docs/row-coloring) for better visualization, and create [custom views](/user-docs/create-custom-views-of-your-data) such as Kanban, Calendar, or Gallery layouts. + +### Method 2: Duplicate an existing table + +Duplicating creates an exact copy of a table's structure and data. Duplicating tables is useful when you need multiple versions of the same structure for different purposes. + +This is perfect for reusing proven setups or creating templates for recurring projects, without altering the original. It’s also practical for generating client-specific tables from a master template or archiving data by duplicating and clearing the original table. + +**Step-by-step instructions** + +1. In the sidebar, **hover over the table** you want to duplicate +2. Click the **vertical ellipsis `⋮`** (three dots) that appears +3. Select **Duplicate** from the menu +4. The duplicate appears immediately below the original + +**What gets duplicated:** + +✅ All fields with their types and configurations +✅ All rows with complete data +✅ Views (Grid, Kanban, Calendar, etc.) +✅ Filters, sorts, and groupings +✅ Field formulas and dependencies +✅ File attachments + +**What doesn't duplicate:** + +❌ Row comments and revision history +❌ Webhooks and automations + +After duplicating a table, customize it to suit its new purpose. Start by renaming the table. Then, update any field values by clicking into the relevant cells to change data. If certain fields are unnecessary, [delete unused fields](/user-docs/field-customization). You can also [reorder fields](/user-docs/field-customization) by dragging and dropping them to arrange columns in the order you prefer. + +> Clear sample data if you duplicated a template to reuse the structure. Delete all rows and start fresh while keeping the field configuration. + + + +### Method 3: Import from external files + +[Import existing data](/user-docs/create-a-table-via-import) from spreadsheets or other formats to quickly populate Baserow tables. This method preserves your data while giving you Baserow's powerful features. + +**Supported file formats** + + - **CSV files** – Import CSV for simple comma-separated data + - **JSON files** – Import JSON for structured data exports + - **XML files** – Import XML for hierarchical data + - **Paste data** – Copy and paste directly from spreadsheets + +After import, review field types and adjust if needed. Baserow intelligently detects field types and creates appropriate fields, but you may want to refine them (e.g., converting text to date fields). + +Learn more about how to [create a table via import](/user-docs/create-a-table-via-import). + + + +### Method 4: Create via data sync + +For advanced users, [data sync](/user-docs/data-sync-in-baserow) creates tables that automatically update from external sources. This keeps your Baserow data synchronized with other systems without manual imports. + +This is useful for connecting to APIs, databases, or services that change frequently and need real-time or scheduled synchronization. + + + +## Frequently asked questions + +### How many tables can I create in a database? + +There's no hard limit, but most databases work best with 5-15 tables. If you need more, consider whether some tables could be combined or if you should create separate databases for different projects. Performance remains excellent with properly organized tables. + +### What's the difference between duplicating a table and creating a new one? + +Duplicating copies an existing table's complete structure and data; saving setup time when you need the same format. Creating a new table starts blank, giving you full control but requiring more initial configuration. Choose duplication for consistency, new tables for unique requirements. + +### Can I rename a table after creating it? + +Yes, click the table name in the sidebar to edit it at any time. Renaming doesn't affect data, views, or relationships; just the display name. Use descriptive names that clearly indicate what the table stores. + +### What happens if I duplicate a table with linked records? + +Link to table fields are duplicated, but the links point to the original table's records, not the duplicate. If you want completely independent tables, you'll need to manually update or remove link fields after duplication. + +### Can I undo table creation if I make a mistake? + +Yes, within 5 seconds of creating a table, an undo button appears at the bottom-right. After that window, you can [delete the table](/user-docs/delete-a-table) which moves it to trash for recovery. This gives you safety nets against accidental creation. + + +## Related content + +Now that you've created your table, explore these features: + +**Build your table structure:** +- **[Add fields](/user-docs/adding-a-field)** – Create columns for different data types +- **[Field types overview](/user-docs/baserow-field-overview)** – Learn about 25+ available field types +- **[Customize fields](/user-docs/field-customization)** – Configure properties and validation + +**Add and organize data:** +- **[Create rows](/user-docs/how-to-make-new-rows)** – Add individual records +- **[Paste data](/user-docs/paste-data-into-baserow-table)** – Bulk import from spreadsheets +- **[Import into existing tables](/user-docs/import-data-into-an-existing-table)** – Add more data later + +**Customize your views:** +- **[Create custom views](/user-docs/create-custom-views-of-your-data)** – Build Kanban, Calendar, Gallery views +- **[Filter and sort](/user-docs/filters-in-baserow)** – Focus on specific data +- **[Table configuration](/user-docs/customize-a-table)** – Adjust appearance and behavior + +**Connect and collaborate:** +- **[Link to table field](/user-docs/link-to-table-field)** – Create relationships between tables +- **[Share views](/user-docs/public-sharing)** – Give others access to your data +- **[Delete tables](/user-docs/delete-a-table)** – Remove tables you no longer need + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account.",,baserow_user_docs,https://baserow.io/user-docs/create-a-table +49,Databases overview,intro-to-databases,Working with data in Baserow databases,"# Introduction to databases in Baserow + +Baserow databases make it easy to organize complex information without needing technical expertise or coding skills. + +Understand how Baserow databases organize your data using tables, fields, and rows. Learn the core concepts, see practical examples, and discover how databases fit into your workspace structure. + +## What is a Baserow database? + +A database is a structured collection of [tables](/user-docs/intro-to-tables) containing rows (records) and columns (fields). + +A Baserow database is a collection of related tables that store and organize your data. Unlike traditional spreadsheets, Baserow databases let you create relationships between tables, automate workflows, and build custom applications on top of your data. + + + +### Database structure + +Databases belong to workspaces. Each database lives inside a workspace and can contain multiple tables for different aspects of your projects, like customer information, inventory tracking, or project management. + +Before creating a database, you need [a workspace](/user-docs/setting-up-a-workspace). Workspaces are the top-level organizational unit where you manage team members, permissions, and billing. + +``` +Workspace +└── Database + ├── Table 1 (Customers) + │ ├── Row 1 (Customer A) + │ ├── Row 2 (Customer B) + │ └── Fields (Name, Email, Phone...) + ├── Table 2 (Orders) + └── Table 3 (Products) +``` + +### How Baserow databases work + +Databases contain multiple tables. Each database can hold unlimited tables. For example, a ""Sales Management"" database might include: Customers table, Orders table, Products table, and Invoices table. + +Tables organize different types of information, and consist of: + - **Rows (records):** Individual records or entries. Each row represents one item, like a single customer or order + - **Fields (columns):** Columns that define what type of data you're storing (name, date, email). Each field stores a specific type of information, like name, email, or price + - **Cells:** The intersection of a row and a field contains the actual data value + - **Relationships:** Connect tables together (link orders to customers) + +Fields define data types. Baserow offers 25+ field types to structure your data properly: Text fields (single line, long text), Number and currency fields, Date and time fields, Links to other tables, File and image uploads, Formulas and calculations, and many more. + +![Baserow database features][1] + +## What makes Baserow databases unique + +| Feature | Traditional spreadsheets | Baserow databases | +|---------|-------------------------|-------------------| +| **Data relationships** | Manual cross-referencing | Built-in table linking | +| **Field types** | Generic text/numbers | 25+ specialized field types | +| **Multiple views** | One sheet view | Grid, Gallery, Kanban, Calendar, Timeline | +| **Collaboration** | File sharing conflicts | Real-time multi-user editing | +| **Automation** | Complex macros required | Visual webhooks and API integration | +| **File storage** | Embedded with size limits | Dedicated file fields with proper storage | +| **Access control** | Share entire file | Granular permissions per table/view | +| **Applications** | Not possible | Build custom apps with Application Builder | + + +## Common use cases + + 1. [Customer relationship management (CRM)][2]: Track customer interactions, sales pipeline, and revenue forecasts in one place. + 2. [Project management][3]: Assign tasks, track progress, and manage deadlines with Kanban or Calendar views. + 3. [Inventory management][4]: Monitor stock automatically, link products to suppliers, and generate reorder alerts. + 4. [Content planning][5]: Plan content schedules, assign writers, track publication status. + 5. [Event management][6]: Coordinate schedules, manage registrations, track attendance. + +## Manage your databases + +### Rename a database + +Database names can be updated anytime without affecting data or structure: + +1. In the home page, click the **`⋮` icon** next to the database name +2. Select **Rename** from the menu options +3. Enter the new name +4. Press Enter or click outside the field to save + +Use clear, descriptive names (e.g., “2024 Sales Pipeline”), include project codes or team names, keep names under 50 characters, and avoid special characters that may cause API issues. + +### Move a database between workspaces + +Currently, databases cannot be moved between workspaces directly. To transfer a database: + +1. [Export the database](/user-docs/export-workspaces) from the source workspace +2. [Import the database](/user-docs/import-workspaces) into the target workspace +3. Delete the original database if no longer needed + +Alternatively, duplicate the database, then manually recreate it in the new workspace for complex structures. + +### Import data +- Drag and drop CSV or Excel files +- [Import from Airtable](/user-docs/import-airtable-to-baserow) with one click +- Use API to programmatically populate tables +- Connect via webhooks for automated data sync + +### Export data +- Download as CSV or JSON +- Use API to extract data for reporting +- Export entire databases for backup + +### Automation and integration +Baserow simplifies database integration without requiring developer expertise: + +**For non-technical users:** +- Use [webhooks](/user-docs/webhooks) to trigger actions when data changes +- Connect with 4,000+ apps via [Zapier](/user-docs/zapier), [Make](/user-docs/make), or [n8n](/user-docs/n8n) +- Set up automated notifications and updates + +**For developers:** +- Full REST API with [automatic documentation](/user-docs/database-api) +- [Database tokens](/user-docs/personal-api-tokens) for secure programmatic access +- Webhook endpoints for real-time data synchronization + +## Frequently asked questions + +### How many databases can I create in a workspace? + +There's no hard limit on the number of databases per workspace. You can create as many as needed to organize different projects or departments. However, consider keeping related tables in the same database for easier relationship management and better organization. + +### What's the difference between a database and a table? + +A database is a container that holds multiple related tables. A table is where your actual data lives in rows and columns. For example, a ""Sales"" database might contain ""Customers,"" ""Orders,"" and ""Products"" tables. + +### Can I share just one table instead of the entire database? + +Not directly at the database level, but you can create [public views](/user-docs/public-sharing) that show specific data from a single table. You can also use [role-based permissions](/user-docs/permissions-overview) to control which tables workspace members can access. For true table-level isolation, consider using separate databases. + +### How do I backup my database? + +Export your database through the workspace settings menu. Choose between exporting individual tables as CSV files or the entire database structure. For automatic backups, you can also use the API to create automated [snapshots](/user-docs/snapshots) as backup. + +### Can I convert an Excel spreadsheet into a Baserow database? + +Yes! Simply [create a new table](/user-docs/create-a-table-via-import) and import your Excel file. After import, you can refine field types and add Baserow-specific features like relationships and formulas. +Learn more: [How to transform spreadsheets into databases](https://baserow.io/blog/how-to-transform-any-spreadsheet-into-a-database). + +### How do Baserow databases handle large amounts of data? + +Baserow databases are designed to scale efficiently. Performance depends on your hosting plan, but typical databases can handle hundreds of thousands of rows. Use filters and views to work with subsets of data, and consider archiving old records to maintain performance. Enterprise plans offer enhanced performance for very large datasets. + +## Related content + +Now that you understand Baserow databases, explore these topics: + +### Create and manage databases +- **[Create a database](/user-docs/create-a-database)** – Build your first database from scratch +- **[Add database from template](/user-docs/add-database-from-template)** – Start quickly with pre-built templates +- **[Delete a database](/user-docs/delete-a-database)** – Remove databases you no longer need + +### Work with tables +- **[Introduction to tables](/user-docs/intro-to-tables)** – Learn about the core building block of databases +- **[Create a table](/user-docs/create-a-table)** – Add tables to organize different types of data +- **[Import data into tables](/user-docs/import-data-into-an-existing-table)** – Bring existing data into Baserow + +### Advanced features +- **[Link tables together](/user-docs/link-to-table-field)** – Create relationships between related data +- **[Introduction to fields](/user-docs/baserow-field-overview)** – Understand all available field types +- **[Database API documentation](/user-docs/database-api)** – Integrate with external systems + +### Migration and integration +- **[Import from Airtable](/user-docs/import-airtable-to-baserow)** – Migrate existing Airtable bases +- **[Zapier integration](/user-docs/zapier)** – Automate workflows with 4,000+ apps +- **[Transform spreadsheets into databases](https://baserow.io/blog/how-to-transform-any-spreadsheet-into-a-database)** – Best practices for conversion + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with + your account. + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/74875146-67f4-4c03-b438-22cd5828a932/Database%20features.png + [2]: https://baserow.io/templates/lightweight-crm + [3]: https://baserow.io/templates/project-management + [4]: https://baserow.io/templates/car-dealership-inventory + [5]: https://baserow.io/templates/content-scheduling-manager + [6]: https://baserow.io/templates/business-conference-event",,baserow_user_docs,https://baserow.io/user-docs/intro-to-databases +50,Workspaces overview,intro-to-workspaces,Baserow workspaces overview,"# Introduction to workspaces in Baserow + +Workspaces are the top-level organizational containers in Baserow where teams collaborate on databases, applications, dashboards, and automations. Each workspace operates independently with its own members, permissions, and content that cannot be shared across workspaces. + +## What are workspaces? + +Workspaces keep your teams, projects, and data organized in secure, collaborative environments. + +A workspace is Baserow's foundational organizational unit, a dedicated space where teams collaborate on related work. Everything you create in Baserow (databases, applications, dashboards, automations) lives inside a workspace. Each workspace has its own members with defined roles and permissions, ensuring secure access control and organized collaboration. + +![Baserow workspace interface][1] + + + +## How workspaces organize your work + +Each workspace can contain: + +- **[Databases][2]**: Structured data in tables with relationships +- **[Applications][3]**: Custom web apps built with Application Builder +- **[Dashboards][4]**: Visual analytics and monitoring interfaces +- **[Automations][5]**: Workflows connecting data and external services + +All of these components can reference and interact with each other within the same workspace, creating integrated systems that work together. + +## Workspace-level search + +You can find any row, table, or database instantly with the global, workspace-level search. If you can’t remember which table or database a specific row lives in, this is the fastest way to find it. + +The search instantly scans across all databases, tables, and rows you have access to. Simply type a keyword, and Baserow will find matching database names, table names, or text within your cells. + +### How to open workspace search + +You can launch the search bar from anywhere in Baserow using two methods: + +* **Keyboard Shortcut:** Press **Cmd + K** (on Mac) or **Ctrl + K** (on Windows/Linux). +* **Sidebar Icon:** Click the **Search** icon located in the main left sidebar. + +Once opened, type your query, and the results will appear instantly. You can click any result to jump directly to that database, table, or row. + +## Manage workspace access + +Every workspace member has an assigned role that determines their capabilities. + +[Learn more about role-based permissions →][6] + +Collaboration starts with inviting team members. Invited users receive an email with instructions to join. They can accept the invitation and immediately access the workspace based on their assigned permissions. + +[Detailed guide to inviting collaborators →][7] + +### Advanced permission management + +For organizations on [Advanced and Enterprise plans][8], Baserow offers sophisticated permission controls: + +- **[Database-level permissions][9]**: Different access levels for different databases in the same workspace +- **[Table-level permissions][10]**: Granular control over individual tables +- **[Team management][11]**: Group users into teams with shared permissions +- **[Custom role configurations][12]**: Tailored permission combinations + +These features enable complex organizational structures while maintaining security and appropriate access control. + +[Complete permissions overview →][6] + + +![Work across multiple workspaces in Baserow][13] + +## Work across multiple workspaces + +Periodically review workspace members and their roles, especially when team members change roles, projects conclude, external collaborators complete their work, or security policies require access reviews. + +### Switch between workspaces + +You can join unlimited workspaces and switch between them freely from the Baserow home page. Each workspace maintains its own member list and permissions, databases and tables, applications and published pages, dashboards, automations, and settings and configurations. + +Use the workspace switcher in the sidebar to navigate between your workspaces instantly. + +### Workspace isolation and independence + +Workspaces are isolated from each other. You cannot link tables across different workspaces, reference data from one workspace in another workspace's formulas, share databases or applications between workspaces, or transfer content directly between workspaces (export/import required) + +This isolation provides security and clear boundaries, but it also means workspace organization requires planning. Keep related databases, applications, and automations in the same workspace so they can work together. + +Learn more: [Create a new workspace][14] + +### Move content between workspaces + +While workspaces are isolated, you can transfer content when needed: + +1. **Export from source workspace**: Export [views][15], [tables][16], or entire [workspaces][17] +2. **Import to destination workspace**: Import the exported data into the [target workspace][18] +3. **Rebuild connections**: Recreate any table [relationships][19] or [application data sources][20] + +Note that this process creates copies, not moves; original content remains unless you delete it. + +## Frequently asked questions + +### How many workspaces can I create? + +There's no limit on the number of workspaces you can create or join. + +### Is there a difference between workspaces on Cloud vs Self-hosted? + +Both [Baserow Cloud and Self-hosted][8] deployments support workspaces with the same core functionality. The workspace concept works identically across deployment options, choose based on your infrastructure and compliance requirements, not workspace capabilities. + +### What's the difference between a workspace and a database? + +A **workspace** is the top-level container holding multiple databases, applications, dashboards, and automations. A **[database][2]** is one component within a workspace that contains related tables. + +### Can I share databases between workspaces? + +No. Workspaces are isolated environments. To share data between workspaces, you must export from one workspace and import to another, or use the API to sync data programmatically. + +### What happens to a workspace if the admin leaves? + +Workspaces must have at least one admin. If you're the only admin, promote another member to admin before leaving. If the last admin leaves without promoting a replacement, contact Baserow support to regain access. + +### Do workspace members count toward my subscription? + +Yes, workspace members do count toward your subscription. [Billable users][8] are anyone with a paid role in the workspace (e.g., admin, editor, builder). Non‑billable users such as pure viewers or commenters do not increase the seat count. + +### Can I rename a workspace after creating it? + +Yes, renaming doesn't affect any content, permissions, or functionality. Use consistent naming conventions. Establish clear naming patterns for workspaces, especially if your organization will have many. + +### Can external clients access my workspace? + +Yes. You can invite clients or external collaborators to workspaces with appropriate role assignments (often Viewer or Commenter roles). For more control, create a dedicated workspace for each client or use the Application Builder to create custom portals with limited access. + +### How do I organize workspaces for an agency with multiple clients? + +Choose based on how much clients need to be isolated from each other and whether projects might span multiple clients. Common approaches for agencies: + +- **One workspace per client**: Complete isolation between client projects +- **Department workspaces**: ""Client Work"", ""Internal Operations"", ""Business Development"" +- **Hybrid**: Client workspaces plus an internal workspace for agency operations + +## Related content + +### Getting started with workspaces +- [Set up a new workspace][21] +- [Quick start: Your path to Baserow mastery](/user-docs/how-to-get-started-with-baserow) +- [Baserow glossary](/user-docs/learn-baserow-basic-concepts) + +### Managing workspaces +- [Invite collaborators to a workspace][7] +- [Manage workspace permissions][6] +- [Working with collaborators][22] +- [Create and manage teams](/user-docs/create-and-manage-teams) + +### Workspace administration +- [Leave a workspace][23] +- [Delete a workspace][24] +- [Understanding role hierarchy](/user-docs/role-based-access-control-rbac) +- [Assign roles at workspace level](/user-docs/assign-roles-to-members-at-workspace-level) + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](https://baserow.io/contact) for questions about Baserow or help with your account + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/f7895adc-ae4c-4ce2-91d4-f12e76daef12/Baserow%20workspace.jpg + [2]: /user-docs/intro-to-databases + [3]: https://baserow.io/user-docs/application-builder-overview + [4]: https://baserow.io/user-docs/dashboards-overview + [5]: https://baserow.io/user-docs/workflow-automation + [6]: /user-docs/manage-workspace-permissions + [7]: /user-docs/working-with-collaborators + [8]: /user-docs/set-up-baserow + [9]: https://baserow.io/user-docs/assign-roles-at-database-level + [10]: https://baserow.io/user-docs/assign-roles-at-table-level + [11]: https://baserow.io/user-docs/assign-roles-to-teams-at-workspace-level + [12]: https://baserow.io/user-docs/assign-roles-to-members-at-workspace-level + [13]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/5d26cdb4-94fa-41bf-9bab-5c919b0e24e5/Work%20across%20multiple%20workspaces.jpg + [14]: https://baserow.io/user-docs/setting-up-a-workspace + [15]: https://baserow.io/user-docs/export-a-view + [16]: https://baserow.io/user-docs/export-tables + [17]: https://baserow.io/user-docs/export-workspaces + [18]: https://baserow.io/user-docs/import-workspaces + [19]: https://baserow.io/user-docs/link-to-table-field + [20]: https://baserow.io/user-docs/data-sources + [21]: /user-docs/setting-up-a-workspace + [22]: /user-docs/managing-workspace-collaborators + [23]: /user-docs/leave-a-workspace + [24]: /user-docs/delete-a-workspace",,baserow_user_docs,https://baserow.io/user-docs/intro-to-workspaces +51,Subscriptions overview,subscriptions-overview,Baserow Subscriptions overview,"# Understanding Baserow subscriptions + +Baserow offers free and paid plans for both cloud and self-hosted deployments. Cloud subscriptions charge per workspace collaborator automatically, while self-hosted subscriptions use manual seat allocation. + +## Overview + +Baserow subscriptions unlock [paid features][1] across cloud and self-hosted environments, with each deployment type using different billing models. + +Cloud subscriptions operate at the workspace level with automatic billing for all collaborators. Self-hosted subscriptions provide granular control over feature access through manual seat allocation. + +Both processes include pro rata billing calculations, meaning you only pay for the remaining days until your next regular payment cycle. + +| Feature | Cloud subscriptions | Self-hosted license | +|---------|-------------------|-------------------------| +| **Billing level** | Per workspace | Per instance | +| **User management** | Automatic billing per active workspace collaborator | Manual seat assignment | +| **Upgraded access** | All workspace collaborators | Only assigned seat holders | +| **Plan flexibility** | Premium or Advanced per workspace | Premium, Advanced seats or Enterprise instance-wide | +| **User mixing** | Cannot be mixed with Free users | Premium and Advanced plans can be mixed with Free users, as license is instance-based. | +| **License management** | Automatic activation | Manual key registration | +| **User assignment** | All workspace members | Admin controls seats | +| **Feature activation** | Per-workspace basis | Per-user basis | +| **Data location** | Baserow's infrastructure | Your servers | +| **Subscription management** | Via baserow.io | Via baserow.io | +| **Scaling** | Instant scaling up/down with workspace changes | Manual seat increases/decreases | +| **Control** | Instant setup, no maintenance | Complete data control and privacy with custom integrations and configurations | +| **Usage** | Limit based on plans | Unlimited rows and storage on all paid plans | + +> Upgrading your Baserow workspace or instance provides immediate access to paid features upon payment completion. Learn more about how to [upgrade to a Paid Plan][3]. + +## Understanding subscription status types + +Baserow subscriptions display distinct status types that indicate your current billing and access situation. + +**Active status** indicates your subscription is functional and provides [paid feature access][1], even if you have initiated cancellation. Active subscriptions continue until the end of their prepaid period, ensuring you receive full value from your purchase. + +**Archived status** means your subscription has expired and no longer provides paid feature access. Archived subscriptions indicate completed billing cycles with no future renewal scheduled. + +**Not scheduled payment** appears on canceled subscriptions that will not renew automatically. These subscriptions maintain active status until expiration, then transition to archived status without further billing. + +![subscription status types][4] + +## User billing classifications + +Understanding which users count toward your subscription helps you manage costs effectively and plan your team structure appropriately. + +### Who is considered a ""user"" for billing purposes? + +| Pricing plan | User | +| --- | --- | +| Free plan | Users on the free plan are not billed. Baserow free plan is ideal for individuals or very small teams. | +| Cloud Premium plan | All workspace collaborators are classified as billable. Billing is automatically based on all the users in a workspace. The entire workspace is upgraded, and you are charged for every collaborator in the workspace. | +| Cloud Advanced plan | Any workspace collaborator with the roles of Editor, Builder, or Admin is billable. Workspace collaborators who have read-only roles, including the Commenter, Viewer, No Access, and No Role, are classified as non-billable and free. Billing is automatically based on the number of users with paid roles in a workspace. | +| Self-Hosted Premium plan | You are billed for a fixed number of seats. Users can be allocated these seats on demand. Any seat assigned to users in the entire instance is classified as billable per seat, since role-based permissions don’t exist. | +| Self-Hosted Advanced plan | Any user with the roles of Editor, Builder, or Admin can be assigned a seat. First, purchase the number of paid seats you need. After your license is active, you can invite additional users as free members without being charged. | +| Self-Hosted Enterprise plan | Users classed as billable will be decided with Baserow’s sales team. Baserow Enterprise plan is designed for large businesses that want to get the most out of Baserow. Please [contact a sales representative ](/contact-sales) to understand how the Enterprise plan will work for your team. | + +## Pro rata billing explained + +Pro rata billing ensures fair pricing when you make subscription changes mid-cycle. All Baserow [subscription changes][5] trigger pro rata billing adjustments that account for the timing of your modifications. + +When you add users or upgrade plans, you receive immediate charges for the difference between your old and new costs, calculated only for the remaining days until your next regular payment. This approach means you never pay twice for the same time period. + +Alternatively, when you downgrade plans or remove users, the system calculates the remaining value of your higher-cost service and credits this amount toward future payments. You don't receive immediate refunds, but the prepaid amount reduces your subsequent billing cycles until the credit is exhausted. + +Cloud subscriptions handle pro rata billing automatically when workspace membership changes. New user invitations trigger billing adjustments within 24 hours of acceptance, ensuring your subscription accurately reflects your current team size without manual intervention. + +## Frequently asked questions + +### How can I check my current plan? + +For cloud plans, you can easily identify your workspace's subscription status directly from the Baserow dashboard interface, which displays plan information next to each workspace name. The dashboard view provides visibility into which workspaces have paid access and which remain on free plans. + +### How quickly do subscription changes take effect after payment? +Subscription upgrades activate immediately upon payment completion, with paid features becoming available within minutes. When you add a new user, billing adjustments are processed within 24 hours of invitation acceptance. + +### Can I have different subscription levels across multiple workspaces? +Yes, cloud subscriptions operate independently at the workspace level, allowing you to maintain paid subscriptions for some workspaces while keeping others on Free, Premium or Advanced plans. + +### What happens to my data when I cancel a subscription? +Canceled subscriptions remain active until the end of the prepaid period. After expiration, you retain access to core Baserow functionality while losing paid features. + +### How does pro rata billing work for subscription changes? +Pro rata billing calculates the exact value of service time remaining when you make changes, charging additional amounts for upgrades and crediting your account for downgrades. This ensures you never pay twice for the same time period while receiving immediate access to new features. + +### Can I transfer licenses between different self-hosted installations? +Yes, self-hosted subscriptions support [instance ID][2] changes that allow license transfers between different server deployments. This flexibility supports infrastructure migrations and development-to-production transitions without requiring new license purchases. + +### What's the difference between Premium and Advanced cloud plans? +Premium plans offer core enhanced features with automatic billing for all workspace collaborators. Advanced plans include role-based permissions and priority support with selective billing based on user roles. + +For complete pricing details and feature comparisons, visit the [Baserow pricing page](https://baserow.io/pricing). + +## Related content + + - [Purchase cloud subscription][3] + - [Manage instance ID][2] + - [Manage Baserow licenses][7] + - [Install self-hosted license][5] + - [Self-hosted licenses][8] + - [Cancel Subscriptions][9] + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account. + + + [1]: https://baserow.io/user-docs/pricing-plans + [2]: https://baserow.io/user-docs/getting-and-changing-the-instance-id + [3]: https://baserow.io/user-docs/buying-a-subscription + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/69b13423-433a-4ab8-b733-b483205c066c/subscription%20status%20types.jpg + [5]: https://baserow.io/user-docs/get-a-licence-key + [7]: https://baserow.io/user-docs/change-a-paid-subscription + [8]: https://baserow.io/user-docs/self-hosted-licenses + [9]: https://baserow.io/user-docs/cancel-subscriptions",,baserow_user_docs,https://baserow.io/user-docs/subscriptions-overview +52,Buy cloud subscription,buying-a-subscription,Purchase a cloud subscription in Baserow,"# Purchase Baserow cloud subscription + +Baserow offers Premium, Advanced and Enterprise subscriptions for both cloud and self-hosted instances. Purchase requires a baserow.io account. Self-hosted users get unlimited storage, while hosted users have storage limits. + +For detailed information about plan features and limitations, please refer to the [pricing plans documentation][pricing-plans]. + +> This article covers how to purchase and set up a Baserow cloud subscription. To purchase a self-hosted license, [visit this page][1]. + +## What is a Baserow subscription? + +Baserow subscriptions unlock [upgraded database features][2] like advanced views, increased record limits, and collaboration tools. Creating a new subscription upgrades your existing workspace or instance from free to paid access. Whether you use Baserow's cloud or run your own server, subscriptions provide the same core functionality with different storage and user management approaches. + +To buy a Baserow subscription, you will need a [baserow.io](http://baserow.io) account, even if the subscription is intended for self-hosted Baserow instances. The process varies depending on whether you're managing cloud workspaces or self-hosted instances. + +For more details about how Baserow subscriptions work, [view this documentation][3]. + +## How to buy a cloud subscription + +When the workspace is upgraded from the Free plan to the Premium or Advanced plan, all [billable users][4] will have access to paid features. + +Inviting more [billable users][4] to the workspace will increase the price of your subscription. When a [billable user][4] accepts an invite, you have to pay the difference. Likewise, the price will be reduced once the [billable user][4] is not a part of the workspace anymore. + +There are two ways to buy a cloud subscription: +- Add users to the workspace first, and then subscribe to a paid plan +- Subscribe to a paid plan first, then get charged every time a new [billable user][4] gets added to the workspace + +### Step-by-step process for workspace subscriptions + +**Step 1: Access subscriptions** + +Sign in to https://baserow.io, then click on your workspace in the top left corner -> **[Subscriptions][5]**. If you have existing subscriptions, click on the **+ Add new** button at the top-right of the page. + +**Step 2: Select cloud version** + +Within the subscriptions page, the list of workspaces within the SaaS (hosted cloud version) will be displayed on the left-hand side of the screen. + +![Baserow subscription selection interface][6] + +**Step 3: Choose workspace and plan** + +From your [existing workspaces][7], select the workspace that you would like to get a subscription for. Within the modal, select a billing period and pricing plan. You can choose to be charged monthly or annually. + +![Workspace and plan selection screen][8] + +**Step 4: Complete payment** + +You will be required to enter your payment card information and authorise payment. In order to proceed with your payment, we may need you to authenticate with your bank. + +**Step 5: Subscription activation** + +Once your transaction has been completed, all [billable users][4] in the workspace will be upgraded to the plan. You will find your active subscription on the overview page. + +Learn more about [subscription status types][9]. + +## Frequently asked questions + +### What's the difference between hosted and self-hosted subscriptions? + +Hosted subscriptions are for databases managed on baserow.io servers, with storage limits but no server maintenance. Self-hosted subscriptions are for your own servers, offering unlimited storage but requiring technical setup and license management. + +### Do I need a baserow.io account to purchase subscriptions? +Yes, you need a baserow.io account to purchase any Baserow subscription, even for self-hosted instances. This account manages billing and license distribution. Please get in [touch with a sales representative](https://baserow.io/contact-sales) if you're interested in the Enterprise plan. + +### How is billing calculated for workspace users? +Billing is based on [billable users][4]. Adding billable users increases costs immediately, while removing billable users reduces costs at the next billing cycle. + +### Can I mix free and paid users in cloud plans? + +No, cloud subscription is per workspace and requires all active contributors to be on the same plan tier, so they cannot be mixed with Free users. However, in Premium and Advanced self-hosted instances, you can mix Free users with paid licenses as license is instance-based. + +### What happens if I exceed storage limits on cloud plans? +Premium cloud plans include 20GB storage, and Advanced plans include 100GB. [Contact support](https://baserow.io/contact) if you approach these limits to discuss upgrade options or data management strategies. + +## Related content + + - [Baserow pricing and plans][2] + - [Purchase subscription][10] + - [Manage instance ID][11] + - [Manage Baserow licenses][12] + - [Install self-hosted license][1] + - [Self-hosted licenses][13] + - [Cancel Subscriptions][14] + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](https://baserow.io/contact) for questions about Baserow or help with your account. + +[pricing-plans]: /user-docs/pricing-plans + + + [1]: https://baserow.io/user-docs/get-a-licence-key + [2]: https://baserow.io/user-docs/pricing-plans + [3]: /user-docs/subscriptions-overview#how-paid-subscriptions-work + [4]: /user-docs/subscriptions-overview#who-is-considered-a-user-for-billing-purposes + [5]: https://baserow.io/subscriptions + [6]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/bd558d45-3840-4a51-bd34-5e19c1001bc1/Baserow%20subscription%20selection%20interface.jpg + [7]: /user-docs/setting-up-a-workspace + [8]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/9c36b33c-a3a4-46a5-b570-c69017efa86d/Workspace%20and%20plan%20selection%20screen.jpg + [9]: https://baserow.io/user-docs/subscriptions-overview#understanding-subscription-status-types + [10]: https://baserow.io/user-docs/buying-a-subscription + [11]: https://baserow.io/user-docs/getting-and-changing-the-instance-id + [12]: https://baserow.io/user-docs/change-a-paid-subscription + [13]: https://baserow.io/user-docs/self-hosted-licenses + [14]: https://baserow.io/user-docs/cancel-subscriptions",,baserow_user_docs,https://baserow.io/user-docs/buying-a-subscription +53,Buy self-hosted license,get-a-licence-key,Buy Baserow self-hosted license,"# How to purchase and install a self-hosted license + +Baserow paid licenses unlock [paid features][1] on self-hosted installations. This approach gives you complete control over which users access paid features while maintaining data sovereignty on your servers. + +> This article covers how to purchase and install a Baserow self-hosted license. [Visit this page][2] if you want to purchase a cloud subscription. + +## Overview + +Self-hosted licenses work differently from cloud subscriptions. Instead of automatic feature activation, you receive a license key that must be manually registered with your specific Baserow instance. + +The licensing system operates on a seat-based model where you assign paid access to specific users rather than entire workspaces. This flexibility allows mixing free and paid users within the same Baserow installation. + +> Please get in [touch with a sales representative](https://baserow.io/contact-sales) if you're interested in the Enterprise plan. + +## Step-by-step license installation + +**Step 1: Get your instance ID** + +Your instance ID connects your self-hosted installation to the license. Only Instance Admins can access this information through the admin panel. + + 1. Log in to your self-hosted Baserow as an Instance Admin. + 2. Click on your workspace in the top left corner -> Admin tools -> Manage licenses. + 3. Copy your unique instance ID. + +![Instance ID location][3] + +**Step 2: Access subscription portal** + +A license can only be obtained on baserow.io. Sign in to https://baserow.io, then click on your workspace in the top left corner -> **[Subscriptions][4]**. If you have existing subscriptions, click on the **+ Add new** button at the top-right of the page. + +> If you have already [purchased a license][4], it will be delivered to you by email, and you can get it from the overview in your account. + +**Step 3: Select the self-hosted option** + +Within the subscriptions page, the right side of the screen will hold the self-hosted version. Choose this option if you have installed Baserow on your own server. [Visit this page][2] to purchase a cloud subscription to set up your Baserow database at baserow.io. + +**Step 4: Enter instance ID** + +On the Subscriptions page, enter your instance ID in the field provided and click **Next**. We need your [instance ID][5] because the license will be connected to it. + +![get your Instance ID][6] + +**Step 5: Configure subscription** + +Next, select the number of seats, payment period and payment plan. + +> When you upgrade to the Advanced plan, start by buying only the number of paid seats you need. Once your license is active, you can then invite free users to join your workspace. If you add everyone during the upgrade, the system won’t separate free users from paid users, and you’ll be billed for all of them. + +Subscriptions are priced per seat, and you can choose to be charged monthly or annually. You can choose the number of seats you want to purchase and [adjust it at any time](https://baserow.io/user-docs/change-a-paid-subscription). + +Then click **Subscribe**. + +![Subscription configuration interface][7] + +**Step 6: Complete payment** + +You will be required to enter your payment card information and authorise payment. The price will be prorated when the number of seat changes. In order to proceed with your payment, we may need you to authenticate with your bank. + +> No free roles exist in the Premium plan, as there is no [role-based permission](https://baserow.io/user-docs/set-permission-level). Every user added to the Premium plan is a [billable user][8]. + +**Step 7: Download license key** + +Once your transaction has been completed. You will find your subscription on the overview page. + +After you purchase a license, you will be able to [download a license key][7] that can be used to register your Baserow instance. + +Navigate to **Subscriptions** → **License subscriptions** → **More details**. Click **Reveal license key** to display your key + +Copy and paste the license key in the field. + +**Step 8: Register license with your instance** + +Register it in your self-hosted instance to activate paid features for selected users. It’s not possible to use the same key on two different installations. + +1. In your self-hosted instance, click on your workspace in the top left corner -> Admin tools -> Manage licenses. +2. Copy and paste your license key into the provided field +3. Click **Register license** + +![License registration interface][9] + +## Managing user assignments + +When upgrading to the Advanced plan, purchase only the paid seats first. After your license is active, you can invite the free users to the workspace. This is to avoid being charged for both the free and paid users. If you add all users when upgrading, the license tool will not distinguish free and paid roles, and thus will charge all users. + +After registering your license, assign paid seats to specific users. Select which registered users can access paid features. Assigned users gain paid access across all workspaces. Non-assigned users continue with free plan limitations. + +Keep in mind that the Premium plan works differently. It doesn’t support free roles or role-based permissions. Every person you add under Premium counts as a [billable user][8]. + +You can [modify user assignments][10] anytime through the admin panel, allowing flexible upgraded access management as your team changes. + +## After license installation + +Monitor your license status through the admin panel, including expiration dates and seat assignments. Plan license renewals before expiration to avoid service interruption. + +Learn more about how to [manage an existing license][10]. + +![view your license ID][11] + +## Frequently asked questions + +### Can I use the same license key on multiple installations? + +No, each license key works only with the specific instance ID it was purchased for. Multiple installations require separate subscriptions and license keys. + +### What happens when my license expires? + +Paid features become unavailable for all assigned users immediately after expiration. Your data remains intact, but paid functionality returns to free plan limitations until you renew. + +### How do I assign upgraded access to new users? + +On the Advanced plan, first purchase the number of paid seats you need. After your license is active, you can invite additional users as free members without being charged. New assignments take effect immediately. + +On the Premium plan, there are no free roles. Every user you add is automatically a billable user, since role-based permissions don’t exist. + +### Can I mix free and billable users in the same workspace? + +Yes, billable and free users can collaborate in the same workspaces as license is instance-based. Billable users access paid features while free users work within standard limitations. Choose exactly which team members receive access to advanced views, exports, and collaboration tools. + +Premium and Advanced licensing allow mixing free and billable users within the same instance through manual seat assignment. If you have 100 free users in total, you can buy a license for 10 seats and assign 10 users to it, meaning 10 users will have premium and 90 are free. This can be combined. + +### How does billing work when switching plans? + +The system calculates the remaining value from your current plan and applies it toward the new plan cost through pro rata calculations, ensuring you receive full value without refunds. + +### What if I need to change my instance ID? + +You can [modify the instance ID][12] associated with your subscription through the baserow.io subscription management interface. This supports server migrations and infrastructure changes. + +## Troubleshooting license installation + +### License registration fails + +Verify your license key is copied correctly without extra spaces or characters. Ensure your instance has internet connectivity to validate the license with Baserow's servers. + +### Paid features not appearing + +Check that your user account is assigned to a paid seat in Admin → Licenses. License assignments affect individual users, not entire workspaces. + +### Cannot access the admin panel + +Only Instance Admins can register licenses. Contact your system administrator if you need admin access or have them complete the registration process. + +## Related content + +- [Enterprise license activation](/user-docs/activate-enterprise-license) +- [Admin panel overview](/user-docs/enterprise-admin-panel) +- [Paid features overview](https://baserow.io/user-docs/pricing-plans) +- [Purchase self-hosted subscription](/user-docs/buying-a-subscription#buy-a-subscription-for-the-self-hosted-version) + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) for implementation advice +- [Contact support](https://baserow.io/contact) for license and technical assistance + + + [1]: https://baserow.io/user-docs/pricing-plans + [2]: https://baserow.io/user-docs/buying-a-subscription + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/1b766e14-d494-4f29-ae99-fa52fec94733/Your%20Baserow%20instance%20ID.jpg + [4]: https://baserow.io/subscriptions/new + [5]: /user-docs/get-a-licence-key#get-your-instance-id + [6]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/bd558d45-3840-4a51-bd34-5e19c1001bc1/Baserow%20subscription%20selection%20interface.jpg + [7]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/6bfe2e32-3b16-4dfd-901d-23d8b02d1c48/License%20configuration%20interface.jpg + [8]: https://baserow.io/user-docs/subscriptions-overview#user-billing-classifications + [9]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/7fc3aedc-e73d-494d-9da1-2aa456ec752c/Register%20License.jpg + [10]: https://baserow.io/user-docs/change-a-paid-subscription + [11]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/0faf781e-e048-4af8-b9c5-4209f86cabd4/view%20your%20license%20ID.jpg + [12]: https://baserow.io/user-docs/getting-and-changing-the-instance-id",,baserow_user_docs,https://baserow.io/user-docs/get-a-licence-key +54,Manage instance ID,getting-and-changing-the-instance-id,Manage instance ID in Baserow self-hosted instance,"# How to find and change self-hosted instance ID + +Baserow instance IDs uniquely identify your self-hosted installation for licensing. This enables centralized subscription management while keeping your data on your servers. + +Instance IDs can be changed for active subscriptions to support server migrations. + +## Quick overview + +Your instance ID acts as a unique identifier that links your self-hosted Baserow installation to paid subscriptions purchased through baserow.io. When you buy a Premium plan, Baserow associates your license with this specific instance ID, ensuring paid features activate only on your authorized server. + +This separates data hosting (your servers) from subscription management (Baserow's systems), giving you deployment control while maintaining proper licensing. + +## How to find your instance ID + +> You need to have an active self-hosted Baserow deployment and Admin access to the Baserow instance. + +1. **Access admin panel**: Log into your self-hosted Baserow as an Instance Admin. +2. **Navigate to licenses**: Click on your workspace in the top left corner -> Admin tools -> Manage licenses. +3. **Copy instance ID**: Find and copy your unique instance ID from the licenses page. + +![Instance ID location](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/1b766e14-d494-4f29-ae99-fa52fec94733/Your%20Baserow%20instance%20ID.jpg) + +## How to change instance ID + +You can modify the instance ID for active subscriptions through the subscription management interface at baserow.io. This process maintains license compliance and billing continuity while supporting deployment flexibility. + +The change process ensures your paid features transfer seamlessly to the new instance without service interruption or additional license costs. + +Learn more about how to [update an existing subscription][1]. + +## When to change your instance ID + +Instance ID changes support several deployment scenarios: + +- **Server migrations**: Moving from development to production environments +- **Infrastructure upgrades**: Transitioning to new server hardware or cloud providers +- **Deployment consolidation**: Combining multiple instances under a single license +- **Disaster recovery**: Restoring service on replacement infrastructure + +| Deployment scenario | Instance ID action | License impact | +|----------|-------------------|----------------| +| Server migration | Change to new instance | License transfers | +| Development/production split | Use separate IDs | Requires separate licenses | +| Backup/disaster recovery | Change to recovery instance | License transfers | +| Load balancing setup | Single ID across nodes | One license covers cluster | + +## Frequently asked questions + +### Can regular users access instance IDs? +No, only Instance Admins can view instance IDs through the admin panel. Regular users don't have access to licensing information or administrative functions. + +### How often can I change my instance ID? +Baserow allows instance ID changes for legitimate deployment needs like migrations or infrastructure updates. The system prevents abuse while supporting normal operational requirements. + +### What happens if I lose my instance ID? +Instance Admins can always retrieve the current instance ID from the admin panel. You can find your instance ID in your self-hosted instance by clicking on your workspace in the top left corner -> Admin tools -> Manage licenses. +If you lose admin access, contact Baserow support to verify your account and assist with instance identification. +Learn more about [installing a self-hosted license][2]. + +### Do I need a new subscription for a new server? +Not necessarily. If you're migrating or replacing an existing deployment, you can change the instance ID to transfer your existing license. New additional deployments require separate subscriptions. + +## Troubleshooting instance ID issues + +### Cannot access the admin panel +Verify you have Instance Admin privileges. Contact your system administrator if you should have admin access but cannot see the Admin option in your interface. + +### Instance ID not displaying +Ensure your Baserow installation is properly configured and running the latest version. + +### License not activating after ID change +Allow up to 15 minutes for license changes to propagate. If paid features remain unavailable, verify that the instance ID was updated correctly in your subscription settings. + +## Related content + +- [Manage Baserow subscription and licenses](https://baserow.io/user-docs/change-a-paid-subscription) +- [Purchase Baserow subscription](https://baserow.io/user-docs/buying-a-subscription) +- [Self-hosted installation guide](https://baserow.io/docs/installation%2Fconfiguration) + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) for deployment advice +- [Contact support](/contact) for license and account assistance + + + [1]: https://baserow.io/user-docs/change-a-paid-subscription#update-a-subscription-or-license + [2]: https://baserow.io/user-docs/get-a-licence-key",,baserow_user_docs,https://baserow.io/user-docs/getting-and-changing-the-instance-id +55,Manage subscription,change-a-paid-subscription,Manage subscription in Baserow,"# Manage an existing Baserow subscription + + Manage existing Baserow subscriptions by adding or removing users, changing plans, [updating payment methods][1], or [canceling subscriptions][2]. Modifying existing subscriptions allows you to adjust your Baserow investment as your team grows or your needs change. + +Cloud subscriptions automatically bill for new workspace users, while self-hosted licenses require manual seat management. All billing changes are calculated pro rata. + +To purchase a new subscription, [visit this page][3]. + +## Overview +Baserow subscription management controls who can access [paid features][4] in your workspace or self-hosted instance. The approach differs significantly between cloud and self-hosted deployments, with cloud subscriptions automatically scaling based on workspace membership while self-hosted licenses require manual seat allocation. + +Learn more about [how subscriptions work in Baserow][6]. + +## Update a subscription or license + +Sign in to https://baserow.io, then click on your workspace in the top left corner -> Subscriptions. + +The subscription details page provides comprehensive information about the [subscription status][7], your current usage, including next payment date, and available modification options. + +![Subscription details interface][8] + +Click on **More details**. Within the subscription details view, you can access several management functions. + +For workspace subscriptions, you can view the [billing plan][4], status, cost, paid users, billing period, features enabled, including how to change payment method, receipt downloads, and usage monitoring. + +For self-hosted licences, you can view the [billing plan][4], [license ID][9], [instance ID][10], license key, status, seats, cost, paid users, billing period, features enabled, including how to change payment method, and receipt downloads. + +This helps you understand both your current seat, row usage and storage consumption and upcoming billing obligations. + +![Subscription management option][11] + +To update a subscription, click **Change subscription** and select your desired options. + +For workspace subscriptions, you can update the billing period, billing plan or [cancel the subscription][2]. + +For self-hosted licenses, you can update the number of seats, instance ID, billing period, billing plan or [cancel the subscription][2]. + +![view your license ID][12] + +The interface shows you the immediate billing impact of your changes before you commit to them. Click **Confirm change** to implement your modifications. + +## Change self-hosted seat counts + +Self-hosted seat management provides precise control over your licensing costs and user access. + +To adjust seat counts for self-hosted subscriptions, you must access the Baserow.io cloud interface even though your actual database runs on your own servers. + +Navigate to your subscription details and click **More details** to access the modification interface. The self-hosted subscription management page allows you to adjust seat counts, change plans, update instance IDs, and modify payment periods all from a single interface. + +![License update interface][13] + +As you modify seat counts, the interface displays the immediate billing impact of your changes. Adding seats results in immediate charges for the pro rata difference, while reducing seats credits your account for future billing cycles. + +Once you confirm the change, the system processes seat additions immediately, charging you the difference for the remaining billing period. Seat reductions credit your account, with the remaining prepaid amount applied to future billing cycles. + +## Download receipt + + 1. Log in to your Baserow account at https://baserow.io. + 2. Click on your workspace in the top-left corner and select **Subscriptions**. + 3. In the workspace or instance modal, choose **More details**. + 4. Within the subscription details view, you can access several management functions and a list of all payment periods. + 5. Locate the invoice you need and click **Download receipt** next to it. + 6. The PDF will be saved to your computer; you can open, print, or forward it as required. + +## Frequently asked questions + +### How quickly do billing changes take effect when I modify my subscription? +Billing changes process immediately for additions and upgrades, with charges appearing within 24 hours. Downgrades and removals credit your account for future billing cycles rather than providing immediate refunds. + +### Can I mix free and billable users in the same workspace or instance? +In Premium and Advanced self-hosted instances, you can mix Free users with paid licenses as license is instance-based. Cloud subscription is per workspace and requires all active contributors to be on the same plan tier, so they cannot be mixed with Free users. + +### What happens to my data if I cancel my subscription? +Your subscription remains active until the end of the prepaid period, giving you time to export data or transition workflows. After cancellation, you retain access to basic Baserow features but lose upgraded capabilities like advanced views and integrations. + +### How do I transfer a license between different self-hosted servers? +Use the [instance ID change feature][10] in your subscription management interface to transfer licenses between servers. This allows you to migrate installations or change infrastructure without purchasing new licenses. + +### Why do I need to use baserow.io to manage my self-hosted subscription? +Baserow uses a unified billing system that manages licenses for both cloud and self-hosted deployments. This approach ensures consistent license tracking, simplified payment processing, and integrated support across all deployment types. + +## Related content + + - [Subscriptions overview][6] + - [Baserow pricing and plans][4] + - [Purchase subscription][3] + - [Install self-hosted license][9] + - [Manage instance ID][10] + - [Self-hosted licenses][14] + - [Update payment methods][1] + - [Cancel subscriptions][2] + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account. + + + [1]: https://baserow.io/user-docs/update-payment-methods + [2]: https://baserow.io/user-docs/cancel-subscriptions + [3]: https://baserow.io/user-docs/buying-a-subscription + [4]: https://baserow.io/user-docs/pricing-plans + [5]: https://baserow.io/user-docs/subscriptions-overview#user-billing-classifications + [6]: https://baserow.io/user-docs/subscriptions-overview + [7]: https://baserow.io/user-docs/subscriptions-overview#understanding-subscription-status-types + [8]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/d448c39d-eb99-4323-a25b-dba38b57f6b0/Subscription%20details%20interface.jpg + [9]: https://baserow.io/user-docs/get-a-licence-key + [10]: https://baserow.io/user-docs/getting-and-changing-the-instance-id + [11]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/b07426a7-89b0-479e-855a-072bb6079a44/Subscription%20management%20option.jpg + [12]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/bff6f7c3-6ccc-453b-942d-4ae2f012abec/view%20your%20license%20ID.jpg + [13]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/d32255fb-252e-46ab-9709-2490c92bff89/License%20update%20interface.jpg + [14]: https://baserow.io/user-docs/self-hosted-licenses",,baserow_user_docs,https://baserow.io/user-docs/change-a-paid-subscription +56,Collaborator field,collaborator-field,Collaborator field in Baserow,"# Working with the Collaborator field + +The **Collaborator field** lets you easily assign specific [workspace members][1] to individual rows, making it clear who is responsible for a task or record. + +This guide covers what a Collaborator field is and when to use it, how to add the Collaborator field to your table, how to assign one or more collaborators to a row, and key differences between the Collaborator field and other user fields. + +Learn more: [Configure field types](https://baserow.io/user-docs/field-customization) + +![Baserow collaborator field image][2] + +## What is a Collaborator field? + +A Collaborator field allows you to select one or more users from a list of people who have been invited to your workspace. It's the best way to directly assign a record (like a task, a lead, or a project) to a team member for ownership or review. + +When you click on a cell in this field, a dropdown menu appears showing all members of the current workspace. You can then select one or more people to tag them on that specific row. + +This field is perfect for assigning tasks in a project management table, tagging a sales lead to a specific account executive, or identifying a content author in an editorial calendar. + +## How to add and use the Collaborator field + +### Add the field + +1. In your table, click the plus sign `+` to [add a new field](/user-docs/adding-a-field). +2. Select **Collaborator** from the field type dropdown menu. +3. Give the field a name (e.g., ""Assigned To"" or ""Owner""). +4. Click **Create**. + + +### Configure notifications + +When creating or editing the field (by clicking the dropdown arrow next to its name and selecting ""Edit field""), you will see an option to **""Notify user when added""**. + +When enabled, the workspace member will receive an in-app notification (and an email, based on their personal [notification settings][90]) every time they are assigned to a row using this field. + +This is perfect for task management or any workflow where you need to actively alert a user that a new item requires their attention. + + +### Assign collaborators + +Once the field is added, you can start assigning people: + +1. Click on any cell in the collaborator column. +2. A dropdown list of all current workspace members will appear. +3. Click on a user's name to assign them. You can select multiple users for the same row. + +To remove an assigned user, click the `x` on their name token in the cell. + +![Assigning a user to a Collaborator field cell][5] + +## Frequently asked questions + +### Can I assign multiple collaborators to one row? +Yes. The Collaborator field allows you to select one or more users from the workspace list for a single cell. + +### What's the difference between a Collaborator field and a 'Created by' field? +They serve different purposes: +* **Collaborator field:** This is a **manual** field. You *choose* who to assign to a row. +* **[Created by field][6]:** This is an **automatic** field. It logs the user who originally *created* the row and cannot be changed. + +### Can I assign someone who is not in my workspace? +No. The Collaborator field can only display and assign users who have been successfully [invited to and joined your workspace][7]. It cannot pull from a public user list or contacts. + +### What happens if a user is removed from the workspace? +If a user is removed from the workspace, their name will also be removed from any records they were assigned to in Collaborator fields. This ensures your data remains clean and only shows active, valid workspace members. + + + +## Related content +* [Add workspace collaborators][7] +* [Working with collaborators in Baserow][8] +* [Created by field][6] +* [Last modified by field][9] + +--- + + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](https://baserow.io/contact) for questions about Baserow or help with your account. + + [1]: https://baserow.io/user-docs/managing-workspace-collaborators + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/a8608c57-ffa9-4289-825d-6471126ffe68/Baserow%20collaborator%20field.jpg + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/b03d63ed-685b-4f23-aab9-fbfa295cac88/Screenshot_2022-09-08_at_16.37.00.png + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/948e4004-4395-44cb-a464-2e94632bb43d/Untitled.png + [5]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/beff48d1-0991-4dae-9758-c17aec6d5c0a/Baserow%20assign%20collaborator%20field.jpg + [6]: /user-docs/created-by-field + [7]: /user-docs/working-with-collaborators + [8]: /user-docs/managing-workspace-collaborators + [9]: /user-docs/last-modified-by-field + [90]: /user-docs/notifications",,baserow_user_docs,https://baserow.io/user-docs/collaborator-field +57,Database tokens,personal-api-tokens,Baserow database tokens for secure access,"# Baserow database tokens: Secure API authentication + +Baserow database tokens provide secure, permission-controlled API access without exposing your account credentials to external applications. + +Database tokens are permanent API keys that let you securely connect external applications to your Baserow data. Create tokens to authenticate API requests for reading, writing, updating, and deleting data without sharing your login credentials. + +> **Performance note**: Baserow Cloud has a limit of 10 concurrent API requests to ensure fair usage across all users. Tables with fewer fields and rows process faster. Self-hosted has no rate limits. + +## What are database tokens? + +Database tokens are permanent authentication keys that grant programmatic access to your Baserow data through the REST API. Unlike temporary session tokens, database tokens don't expire and can be used continuously by external applications, scripts, or integrations. + +These tokens act as digital keys, allowing authorized systems to perform specific operations on your databases while maintaining security through granular permission controls. You can create multiple tokens with different access levels for different use cases. + +## Token types in Baserow + +Baserow offers two authentication methods for API access: + +| Token type | Duration | Use case | Permissions | Operations | +|------------------|---------------------|-------------------------------------------------|------------------------------------|----------------------------------------------------------------------------| +| Database token | Permanent | External applications, automation tools, long-running scripts | Configurable per workspace and table | Create, read, update, delete rows; limited to data operations | +| [JWT token][1] | Temporary (7 mins) | Short-term operations, development testing | Full account access | All API endpoints including database/table management | + + +> **[Enterprise license][2]:** Only workspace-level admins and builders can create database tokens, ensuring proper access control for sensitive operations. + +## How to create a database token + +1. **Access token settings** + - Click on your workspace in the top left corner + - Navigate to **Settings** + - Select the **Database tokens** tab + +2. **Create new token** + - Click **Create token +** + - Use a descriptive name that indicates the token's purpose (e.g., ""Zapier Integration"" or ""Mobile App Access"") + - Select the target workspace + +3. **Generate and secure your token** + - Click **Create token** + - Copy the generated token immediately + - Store it securely + +![Create a Baserow database token][3] + +## Managing database tokens + +It is recommended to create separate tokens for different applications or environments. Document where each token is used for easier management. + +### Copy an existing token +1. Find your token in the **Database tokens** list +2. Click the ellipsis (•••) menu beside the token +3. Click the copy icon to copy the token ID + +### Regenerate a compromised token +If your token is accidentally exposed: +1. Click **Generate new token** on the existing token +2. Update all applications using the old token +3. The old token becomes invalid immediately + +### Delete unused tokens +1. Click the ellipsis menu beside the token +2. Select **Delete** to permanently remove access +3. Ensure no applications are still using the token + +### Rename tokens +Click **Rename** to update the token's display name without affecting its functionality. + +![Regenerate database token][4] + +## Database token permissions + +Database tokens use role-based permissions that determine what operations are allowed: + +| Permission | Description | API Operations | +|------------|-------------|----------------| +| **Create** | Add new rows (includes read access) | POST to `/api/database/rows/table/{table_id}/` | +| **Read** | View existing data | GET from rows and table endpoints | +| **Update** | Modify existing rows (includes read access) | PATCH to row endpoints | +| **Delete** | Remove rows | DELETE from row endpoints | + +**No access**: Token cannot interact with table + +Only grant necessary permissions, review token permissions periodically, and use different tokens for development/production. + +### Setting workspace-level permissions +- **All tables checked:** Token works on every table in the workspace +- **Specific tables:** Limit access to selected tables only +- **Operation toggles:** Enable/disable create, read, update, delete per workspace + +## Using tokens with the API + +### Authentication header format +```bash +Authorization: Token YOUR_DATABASE_TOKEN_HERE +``` + +### Example API request +```bash +curl -H ""Authorization: Token abc123def456"" \ + -H ""Content-Type: application/json"" \ + https://api.baserow.io/api/database/1/tables/2/rows/ +``` + +### Common integration patterns +- **Zapier/Make:** Use token in connection settings +- **Custom scripts:** Include in HTTP headers +- **Mobile apps:** Store securely, never hardcode + +## Frequently asked questions + +### What happens if I delete a token that's in use? +Applications using the deleted token will immediately lose access and receive authentication errors. Update applications with a new token before deleting the old one. + +### Can I see what operations a token has performed? +Currently, Baserow doesn't provide detailed audit logs for token usage. Consider implementing logging in your applications that use the tokens. + +### How do I know if my token permissions are correct? +Test your token with a simple API call to verify permissions work as expected. The API will return permission errors for unauthorized operations. + +### What's the difference between database tokens and personal API tokens? +These are the same thing - ""database tokens"" and ""personal API tokens"" refer to the same permanent authentication method in Baserow. + +### Can I use one token for multiple workspaces? +No, each database token is scoped to a single workspace. Create separate tokens for accessing different workspaces. + +## Troubleshooting common issues + +### Authentication errors +- Verify token is included in the `Authorization` header +- Check token hasn't been deleted or regenerated +- Ensure proper header format: `Authorization: Token YOUR_TOKEN` + +### Permission denied errors +- Review token permissions for the target table +- Confirm workspace access is enabled +- Check if you're trying operations beyond token scope + +### Token not working after creation +- Copy the token immediately after creation +- Tokens cannot be viewed again once the creation dialog closes +- Regenerate if you suspect the token was copied incorrectly + +## Related content + + - [Baserow webhooks](/user-docs/webhooks) - Real-time notifications for data changes + - [Database API documentation](/user-docs/database-api) - Complete API reference + - [Database and table IDs](/user-docs/database-and-table-id) - Finding required identifiers + - [Zapier integration](/user-docs/zapier) - Connect with 4000+ apps + - [Make integration](/user-docs/make) - Advanced automation workflows + - [Backend API](/docs/apis%2Frest-api) - Technical API documentation + - [How to connect Baserow to external tools with the API][5] + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://api.baserow.io/api/redoc/#tag/User/operation/token_auth + [2]: https://baserow.io/user-docs/enterprise-license-overview + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/f2b1b56c-6471-4c5a-912f-d88b6fd9f352/Create%20a%20Baserow%20database%20token.jpg + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/b7816e55-e09f-48e7-945d-d7aac7da3a25/Regenerate%20database%20token.jpg + [5]: https://baserow.io/blog/connect-baserow-to-external-tools-with-api",,baserow_user_docs,https://baserow.io/user-docs/personal-api-tokens +90,Zapier,zapier,Integrate Baserow with Zapier,"# Zapier integration + +Zapier connects Baserow to thousands of apps and services, enabling you to automate repetitive tasks without writing code. Build custom workflows that execute actions in response to triggers across your entire tech stack. + +![Baserow in Zapier][1] + +## What you'll need + +- A Baserow account +- A free [Zapier](https://zapier.com/) account +- A Baserow [database token][2] for authentication + +## Supported operations + +Baserow offers comprehensive Zapier integration with triggers, actions, and searches to automate your workflows. + +### Triggers + +Triggers start your automated workflows when specific events occur in Baserow. + +| Trigger | Description | Use case | +|---------|-------------|----------| +| **Row Created** | Fires when a new row is added to a table | Notify team when new lead is added | +| **Row Created or Updated** | Fires when a row is created or modified | Sync data across multiple platforms | +| **Row Updated** | Fires when an existing row is modified | Track changes to project status | + +### Actions + +Actions are operations Zapier performs in your Baserow database. + +| Action | Description | Use case | +|--------|-------------|----------| +| **Create Row** | Adds a new row to a table | Add form submissions to database | +| **Update Row** | Modifies an existing row by ID | Update customer records from CRM | +| **Delete Row** | Removes a row by ID | Archive completed tasks | +| **Get Single Row** | Retrieves one row by ID | Fetch specific record details | +| **List Rows** | Returns multiple rows from a table | Export filtered data to reports | + + + + + +## Getting started with Baserow Zaps + +A Zap is an automated workflow connecting your apps. Each Zap has a trigger (what starts the workflow) and one or more actions (what happens automatically). + +### Authentication + +Before connecting Baserow to Zapier, you need a [database token][2] for authentication. + +> **Security note:** Database tokens function like passwords. Keep them secure and never share them publicly. Store your token in a secure location immediately after creation. + +### Connect to Zapier + +1. Create or open a Zap in your Zapier account +2. Search for **Baserow** and select it as your app +3. Click **Sign in** or **Connect a new account** +4. Enter your Baserow API URL: + - Cloud version: `https://api.baserow.io` + - Self-hosted: Your custom installation URL +5. Paste your database token +6. Click **Continue** to authenticate + +Your Baserow account is now connected to Zapier and ready to use in workflows. + +### Finding your table ID + +Most Baserow operations require a table ID. To find it: + +1. Open your Baserow database +2. Click the three dots (**...**) next to any table name +3. The table ID appears in brackets in the menu + +Learn more about [database and table IDs](/user-docs/database-and-table-id). + +### Understanding row IDs + +When updating, deleting, or retrieving specific rows, you'll need the row ID. Each row has a unique identifier displayed in the leftmost column of your table. + +Learn more about [row identifiers](/user-docs/overview-of-rows#what-is-a-row-identifier). + +## Frequently asked questions + +### How do I find my Baserow API URL? + +Your API URL depends on your Baserow installation. For cloud users at baserow.io, use `https://api.baserow.io`. Self-hosted users should use their custom installation URL. Find your complete [API documentation][3] in your Baserow account under Settings → API documentation. + +### Can I trigger a Zap when any field in a row changes? + +Yes, use the **Row Created or Updated** trigger. This fires whenever any field in a row is modified, allowing you to sync changes across systems in real-time. + +### What's the difference between Get Single Row and List Rows? + +**Get Single Row** retrieves one specific row by ID, perfect when you know which record you need. **List Rows** returns multiple rows based on your criteria, useful for batch operations or filtering data. + +### How do I filter which rows trigger my Zap? + +Use Zapier's built-in filter functionality in your Zap workflow. Add a filter step after your Baserow trigger to specify conditions that rows must meet before continuing the workflow. + +### Can I use Zapier with Baserow webhooks? + +Yes, you can use Zapier's Webhook trigger to receive data from Baserow webhooks for more customized automation. Learn more about [Baserow webhooks](/user-docs/webhooks). + +## Related resources + +- [Baserow database tokens](/user-docs/personal-api-tokens) +- [Database API documentation](/user-docs/database-api) +- [Webhooks in Baserow](/user-docs/webhooks) +- [Database and table IDs](/user-docs/database-and-table-id) + +### Integration tutorials + + - [Automate your workflow: Sync Google Sheets and Baserow with Zapier](/blog/google-sheets-baserow-zapier) + - [Streamline collaboration and review process with database automation](/blog/automate-collaboration-and-review-process) + - [Automate Custom Notifications from Baserow Form Submissions with Zapier](/blog/how-to-automate-custom-notifications-from-baserow) + - [Manage User Access to Softr in Baserow Database](/blog/manage-user-access-to-softr-baserow) + - [How to sync Baserow database and Excel spreadsheet with Zapier][4] + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](https://baserow.io/contact) for questions about Baserow or help with your account + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/6ea03f11-ee33-43f8-ae6a-9400956b6746/Baserow%20in%20Zapier.jpg + [2]: https://baserow.io/user-docs/personal-api-tokens + [3]: https://baserow.io/user-docs/database-api + [4]: https://baserow.io/blog/sync-baserow-excel-zapier",,baserow_user_docs,https://baserow.io/user-docs/zapier +91,Pipedream,pipedream,Integrate Baserow with Pipedream,"# Pipedream integration + +Connect Baserow to Pipedream to build automated workflows using webhooks and the Baserow API. Use Node.js or Python to create, update, and sync data between Baserow and thousands of other apps. + +Baserow's Pipedream integration makes it easy to automate data workflows in minutes without infrastructure setup. + +## Overview + +Pipedream lets you automate Baserow workflows without managing servers. When data changes in your Baserow tables, Pipedream workflows can automatically trigger actions in other apps, or vice versa. You can write custom code in Node.js or Python to transform data, apply business logic, and integrate with over 4,000 services. + +## What you can do + +| Feature | Description | +|---------|-------------| +| **Webhook triggers** | Run workflows when Baserow rows are created, updated, or deleted | +| **API actions** | Use any Baserow API endpoint in Node.js or Python | +| **Data transformations** | Map and transform data between Baserow and other apps | +| **No-code + code** | Build with visual steps or write custom code | + +## Supported operations in Pipedream + +### Trigger + + - New or Updated Row + +### Custom actions + + - Build any Baserow API request + - Use any Baserow API in Node.js + - Use any Baserow API in Python + - Use AI to generate a custom Baserow action + +### Pre-built actions + + - Create Row + - Delete Row + - Get Row + - List Rows + - Update Row + +## Prerequisites + +Before you begin, make sure you have: + +- A [Pipedream account](https://pipedream.com) +- A Baserow account with at least one database and table +- A [Baserow API token](/user-docs/personal-api-tokens) from your account settings + +## How to set up a Baserow workflow in Pipedream + +### Step 1: Build a new workflow + +In Pipedream, workflows must be [created in Projects][2]. Create a new project, and then create a new workflow. + +Configure GitHub Sync for projects to enable git-based version control to develop in branches, commit to or pull changes from GitHub, view diffs, and create PRs. + +### Step 2: Configure the trigger + +Next, Pipedream will launch the workflow builder and prompt you to add a trigger. Clicking the trigger opens a new menu to select the trigger. Select **New or Updated Row** Baserow trigger or **New HTTP / Webhook Requests**. + +![Baserow in Pipedream][4] + +### Step 3: Authenticate with Baserow + +You need to generate an [API token][3] to create a new connection. Pipedream will securely store the token for future use + +Click **Connect Account** and select Baserow. Enter your [Baserow API token](/user-docs/personal-api-tokens). + +> By default, `https://api.baserow.io/api` is used. If you are self-hosting Baserow, replace `https://api.baserow.io/api` with the base URL of your on-premise Baserow app, e.g. `https://my-domain.com/api`. + +To configure a new webhook request, Pipedream will generate a unique URL to trigger this workflow. Customize the event data, response, and filters as needed. Copy the generated webhook URL; you'll use this in Baserow. Once your workflow is deployed, it will run on every request to this URL. + +### Step 4: Connect Baserow webhook to Pipedream + +For a new webhook request, generate a test event to help you build the workflow. + +In Baserow, open your database and go to the table you want to monitor. Create a [webhook](/user-docs/webhooks) and input the Pipedream URL. Choose which events trigger the webhook (create, update, delete). Test the webhook by creating or modifying a row in Baserow. + +To learn more about setting webhooks, read our documentation on [creating and editing webhooks][5]. + +### Step 5: Verify the webhook trigger data + +Return to Pipedream and select the incoming event from the dropdown. Expand the `body` object to view the data sent from Baserow. + +Pipedream will automatically select and display the contents of the selected event. Validate that the message was received as part of the event `body`. This data will be available in all subsequent workflow steps. + +> [Monitor webhook activity][5] in Baserow to troubleshoot failed requests. Click **Webhooks** and view request and response logs for each webhook call. + +![Expanded event body][6] + +### Step 6: Add a Baserow action + +Click **+** to add a new step. Search for and select the **Baserow** app + +Select any Baserow custom or pre-built action. + +![Baserow operators in Pipedream][1] + +### Use any Baserow API in Node.js + +Select **Use any Baserow API in Node.js** action to connect your account and customize a Baserow API request. + +Pipedream Code steps drive the logic of your workflow and let you write any custom Node.js code. The workflow builder will accept text input to populate the steps. + +Click **Refresh fields** to generate props from previous steps. + +Use the object explorer to map data from `steps.trigger.event.body`. Write your API call using `this.propName` to reference dynamic values. Replace `[Table_ID]` with your actual Baserow table ID. + +![Final code configuration][14] + +### Step 8: Test and deploy + +Now that the configuration is complete, click **Test** to validate the configuration for this step. When the test is complete, you will see a success message and a summary of the action performed. + +Next, return to your Pipedream workflow and click **Deploy** to run your workflow on every trigger event. + +To validate that your workflow is working as expected, send a new request to your workflow. The event will instantly appear in the event list. Select it to inspect the workflow execution. + +## Frequently asked questions + +### What triggers can I use with Baserow in Pipedream? + +You can trigger Pipedream workflows from Baserow using the Baserow trigger or webhooks for row creation, updates, or deletions. Pipedream also supports scheduled triggers (cron) and HTTP requests. + +### Do I need to write code to use Pipedream with Baserow? + +No. Pipedream offers pre-built actions for common tasks. However, custom code steps in Node.js or Python give you complete control over data transformations and API calls. + +### How do I find my Baserow table ID? + +In Baserow, open your table and check the URL. The table ID appears after `/table/` in the address bar. Alternatively, use the [Baserow API documentation](/user-docs/database-api) to list all tables. + +### Can I connect multiple Baserow databases in one workflow? + +Yes. You can add multiple Baserow steps in a single workflow, each authenticated with the same or different API tokens depending on your workspace setup. + +## Related content + +- [Webhooks in Baserow](/user-docs/webhooks) +- [Baserow API tokens](/user-docs/personal-api-tokens) +- [Baserow API documentation](/user-docs/database-api) +- [Zapier integration](/user-docs/zapier) +- [Make integration](/user-docs/make) +- [n8n integration](/user-docs/n8n) + +--- + +Still need help? If you're looking for something else, please don't hesitate to make recommendations or ask us questions; we're here to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/c17c62c7-f25c-4a53-9fe8-602d3ad1d637/Baserow%20operators%20in%20Pipedream.jpg + [2]: https://pipedream.com/projects + [3]: https://baserow.io/user-docs/personal-api-tokens + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/cf6f1bfc-3561-461d-b498-b16c9aa4e155/Baserow%20in%20Pipedream.jpg + [5]: https://baserow.io/user-docs/webhooks + [6]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/296ed7a0-43ef-42c5-8ab4-d8859f079e8d/Screenshot_2022-10-20_at_05.47.16.png + [7]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/08542848-9dc2-404d-af9d-0430f6e59dd3/Screenshot_2022-10-18_at_16.14.28.png + [8]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/f4e3aa07-b014-4721-8c04-6a23d202f549/Screenshot_2022-10-18_at_16.16.01.png + [9]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/955c611f-9e79-48fc-93ca-414e426b6c3d/Screenshot_2022-10-18_at_16.20.46.png + [10]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/43c158f1-3fe1-4db0-a735-198157364c5b/Screenshot_2022-10-18_at_16.34.40.png + [11]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/56e30e1f-6c8f-497a-a131-b1fc0d855f2e/Screenshot_2022-10-20_at_06.20.22.png + [12]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/7e17c1ad-3e60-4b4b-b7c5-fadcfcc93529/Screenshot_2022-10-20_at_06.23.55.png + [13]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/1da2aca0-207b-4174-a01f-2f21663ef8db/Screenshot_2022-10-18_at_16.45.17.png + [14]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/492da8b5-7298-4aaa-ad84-a5d8ee0642d9/Screenshot_2022-10-20_at_06.33.33.png + [15]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/9abbd422-7e4f-413e-a75f-6b07f9d1316d/Screenshot_2022-10-18_at_16.49.37.png + [16]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/d6521859-d239-447e-ac82-d93c2b52f415/Screenshot_2022-10-18_at_17.06.48.png",,baserow_user_docs,https://baserow.io/user-docs/pipedream +92,SSO overview,single-sign-on-sso-overview,Baserow Single Sign-On (SSO) explained,"# Single Sign On overview + +Single Sign On (SSO) allows users to log in just one time with one set of credentials to get access to all corporate apps, websites, and data for which they have permission. + +Baserow integrates with any 3rd party SSO provider using Security Assertion Markup Language (SAML) to control who can log in and let them do so without having to sign-up to your Baserow separately. + +> Single Sign-On feature is a part of the Baserow Enterprise offering. Instance-wide features are only available on the self-hosted Enterprise plan. To learn more about the Baserow enterprise plan, [visit our pricing page][1]. +> + +Only Instance admins have access to the Baserow Admin panel. Instance Admins have staff access to the entire self-hosted instance. + +![enter image description here][2] + +Baserow Users can use Single Sign On (SSO) to maintain their user identities in a central location so they can access many services using the same user base. + +## Prerequisites + +In general, to configure an authentication provider for single-sign-on users will need to: + +- Obtain Client ID and Secret from your provider of choice and use them to create a new authentication provider in Baserow. +- Know the provider’s base URL for GitLab or OpenID Connect providers. +- Set/allow the Baserow Callback URL in your provider so that users can be safely redirected back to Baserow upon login. + +## View a list of authentication providers + +To view the providers registered in your instance: + +1. Visit your Baserow server and log in as an instance-wide admin. +2. In the left menu, select **Admin**. +3. Click the **Authentication** page. The Authentication providers pane opens and displays a list of the providers in your server. + +![enter image description here][3] + +## SAML SSO Providers + +Security Assertion Markup Language (SAML) is a security standard for managing authentication and access. When using SAML SSO, users can log in to their Baserow organization using the organization’s identity provider. + +Baserow supports dedicated integrations with the following identity providers: + +- [Set up SSO for Okta][4] +- [Set up SSO for OneLogin][5] +- [Set up SSO for Azure AD](/user-docs/configure-sso-with-azure-ad) + +![enter image description here][6] + +## OAuth 2 SSO Providers + +OAuth2 protocol provides secure delegated access without sharing the credentials. It allows users to give access to their resources hosted by a service provider, such as Facebook, without giving away credentials. It acts as an intermediary on behalf of the end user, providing the service with an access token that authorizes specific account information to be shared. + +- [Configure Google provider][7] +- [Configure Facebook provider][8] +- [Configure GitHub provider][9] +- [Configure GitLab provider][10] + +## OpenID Connect SSO + +OpenID Connect is an identity layer built on top of the OAuth 2.0 protocol. Its purpose is to give you one login for multiple sites. With the support of OpenID Connect, the Baserow users are now able to use ANY service that supports this exact protocol to login into the tool. + +- [Set up SSO for OpenID Connect][11] + +## Related content + + - [Baserow Enterprise plan][12]. + - [Enable SSO in the admin panel][13]. + - [Email and password authentication][14]. + +--- + + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account + + [1]: /pricing + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/d58ccccd-1a15-4563-82b8-b0f02afae076/Untitled.png + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/c21df210-ed52-45d1-bcff-943468ac48dc/Screenshot%202023-02-15%20at%2009.37.24.png + [4]: /user-docs/configure-sso-with-okta + [5]: /user-docs/configure-sso-with-onelogin + [6]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/eb37acf4-c48f-4c77-ae46-2448b3b1f807/Untitled%201.png + [7]: /user-docs/configure-google-for-oauth-2-sso + [8]: /user-docs/configure-facebook-for-oauth-2-sso + [9]: /user-docs/configure-github-for-oauth-2-sso + [10]: /user-docs/configure-gitlab-for-oauth-2-sso + [11]: /user-docs/configure-openid-connect-for-oauth-2-sso + [12]: /user-docs/enterprise-license-overview + [13]: /user-docs/enable-single-sign-on-sso + [14]: /user-docs/email-and-password-authentication",,baserow_user_docs,https://baserow.io/user-docs/single-sign-on-sso-overview +93,Enable SSO,enable-single-sign-on-sso,Enable Single Sign On (SSO),"# Enable Single Sign On (SSO) in the admin panel + +Streamline your login process with Single Sign-On (SSO), which enables users to log in once using a single set of credentials. With SSO, you can conveniently access all corporate applications, websites, and authorized data. Make the most of your Baserow experience by simplifying authentication and securely accessing your resources. + +Learn how to integrate SSO to seamlessly authenticate across various applications and systems without the need to remember multiple usernames and passwords. + +## Overview + +Instance Admins can set up Single sign-on (SSO) with Identity Providers (IdP) for their teams' logins to Baserow. + +> Single Sign-On feature is a part of the Baserow Enterprise offering. Instance-wide features are only available on the self-hosted Enterprise plan. To learn more about the Baserow enterprise plan, [visit our pricing page][1]. +> + +Only Instance admins on a self-hosted Baserow server with the Enterprise plan can access the SSO admin page. Instance Admins have staff access to the entire self-hosted instance. + +## Add providers for SSO SAML + +Baserow uses SAML (Security Assertion Markup Language) to simplify and secure the authentication process so users only need to log in once with a single set of authentication credentials. + + 1. From your Baserow dashboard, go to Admin → Authentication in the navigation sidebar on the left. Under the authentication configuration section, click the “Add Provider” button. + + 2. Select “SSO SAML Provider” from the dropdown menu. Clicking this will open up a configuration window: + + ![enter image description here][2] + + 3. When the “Add a new SSO SAML provider” modal is opened, you can see the `Default Relay State URL` and the `Single Sign On URL` needed to configure a SAML application. You'll need this value later, so make a note of them. + + ![enter image description here][3] + + 4. Next, retrieve your third-party SSO metadata and domain from your SSO identity provider, following the instructions for each in this guide: + + - [Configure OneLogin for SAML SSO][4] + - [Configure Okta for SAML SSO][5] + - [Configure Azure AD for SAML SSO](/user-docs/configure-sso-with-azure-ad) + + 5. Paste the XML metadata in the authentication popup. You’ll end up with something like this: + +![enter image description here][6] + + 6. Save the new provider. Click 'Create' to allow the SSO login configuration to occur. + +After the provider has been correctly created, you should see it listed in the provider's list. + +## OAuth provider configuration + +Baserow supports a variety of OAuth 2 providers like Google, Facebook, GitLab, GitHub, and any providers that support OpenID Connect protocol. + + 1. From your Baserow dashboard, go to Admin → Authentication. Under the authentication configuration section, click the “Add Provider” button. + + 2. Select a provider from the dropdown menu. Clicking this will open up a configuration window: + +![enter image description here][7] + + 3. When the modal is opened, you can see the **Callback URL** needed to configure the provider. You'll need this value later, so make a note of it. + +![enter image description here][8] + + 4. Next, retrieve your **Client ID** and **Secret** from the provider, following the instructions for each in this guide: + - [Configure SSO with Google as the Identity Provider][9] + - [Configure SSO with Facebook as the Identity Provider][10] + - [Configure SSO with GitHub as the Identity Provider][11] + - [Configure SSO with GitLab as the Identity Provider][12] + - [Configure SSO with OpenID Connect][12] + + To configure OpenID Connect, you will also need to retrieve your **Custom provider name** and **Base URL** from the provider. + + + 5. After retrieving your organization's third-party SSO details, you will need to enter the provider's **Client ID** and **Secret** that you receive from the IdP in the fields in Baserow. + - Fill in the Provider’s name. This name will be displayed to your Baserow users on the login screen. + - Fill in the **Client ID** and **Secret** that you obtained from the provider. + - To configure OpenID Connect, also fill in the Provider’s Base **URL**. Also, you can optionally set a custom GitLab **URL** in case you are self-hosting GitLab. + + 6. Save the new provider. Click 'Create' to allow the SSO login configuration to occur. + +After the provider has been correctly created, you should see it listed in the provider's list. + +![enter image description here][13] + +## Edit or delete an identity provider + +On your authentication page in the admin section, you can edit, delete or disable an authentication provider. + +Any IdP, including Email and Password authentication, can be disabled/enabled, but at least one provider needs to be enabled. To disable or enable an authentication provider, use the toggle beside the provider. + +> If authentication with Email and Password is disabled, at least one authentication provider must always be enabled. It is not possible to delete or disable the last enabled provider. + +To edit or delete an authentication provider, click the ellipsis icon beside the provider and select *Edit* or *Delete:* + +![enter image description here][14] + +## Related content + + - [Single Sign On (SSO) overview][15]. + - [Baserow Enterprise plan][16]. + - [Email and password authentication][17]. + +--- + + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we’re ready to assist you. + +   [Ask the Baserow community](https://community.baserow.io) + +   [Contact support](/contact) for questions about Baserow or help with your account. + + + [1]: /pricing + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/fbb90e5c-15ae-41e4-ab1e-7991449524b6/Screenshot_2022-11-03_at_14.02.00.png + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/b73f76eb-3286-4c13-8fa8-597bbec339b6/Screenshot_2022-11-01_at_12.39.19.png + [4]: /user-docs/configure-sso-with-onelogin + [5]: /user-docs/configure-sso-with-okta + [6]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/874d2487-8e4e-432f-a0ec-106bc51e5066/Screenshot_2022-11-01_at_16.11.29.png + [7]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/b131496a-ee16-4322-b0a1-294f46afe1d2/Screenshot_2022-11-04_at_12.36.58.png + [8]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/8f6162b6-145d-4545-a6a3-26c443fd2d5f/Screenshot_2022-11-04_at_12.42.36.png + [9]: /user-docs/configure-google-for-oauth-2-sso + [10]: /user-docs/configure-facebook-for-oauth-2-sso + [11]: /user-docs/configure-github-for-oauth-2-sso + [12]: /user-docs/configure-gitlab-for-oauth-2-sso + [13]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/7ac014e5-12ed-4883-b281-9d7603bbc6c3/Screenshot%202023-01-06%20at%2012.30.10.png + [14]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/d1a6cfe7-b770-4e85-84c8-cb8fb6e3198c/Screenshot_2022-11-04_at_08.12.21.png + [15]: /user-docs/single-sign-on-sso-overview + [16]: /user-docs/enterprise-license-overview + [17]: /user-docs/email-and-password-authentication",,baserow_user_docs,https://baserow.io/user-docs/enable-single-sign-on-sso +94,Configure SSO with Okta,configure-sso-with-okta,Configure SSO in Baserow with Okta,"# Configure Single Sign-on (SSO) with Okta + +This guide is intended for [Admins](/user-docs/working-with-collaborators#set-the-permission-level-for-collaborators) setting up SSO SAML with Okta. + +When you configure Single Sign-on (SSO) with Okta, your users will be able to create and sign into their Baserow accounts using Okta. + +If you are looking for information on setting up SSO with other providers: + +- [Configure Azure AD for SAML SSO](/user-docs/configure-sso-with-azure-ad) +- [Configure OneLogin for SAML SSO](/user-docs/configure-sso-with-onelogin) +- [Configure Google for OAuth 2 SSO](/user-docs/configure-google-for-oauth-2-sso) +- [Configure Facebook for OAuth 2 SSO](/user-docs/configure-facebook-for-oauth-2-sso) +- [Configure GitHub for OAuth 2 SSO](/user-docs/configure-github-for-oauth-2-sso) +- [Configure GitLab for OAuth 2 SSO](/user-docs/configure-gitlab-for-oauth-2-sso) +- [Configure OpenID Connect for OAuth 2 SSO][1] + +> Single Sign-On feature is a part of the Baserow Enterprise offering. Instance-wide features are only available on the self-hosted Enterprise plan. To learn more about the Baserow enterprise plan, [visit our pricing page](https://baserow.io/pricing). +> + +Here's how to set up Okta to sign in to your Baserow account. + +## Set up SSO SAML with OneLogin + +To get started, log into your Okta account and click **Admin** in the top right corner: + +![enter image description here][2] + +Click the **Applications** tab in the sidebar on the Okta admin page, then select the **Applications** option from the dropdown menu. + +Next, click the `Create App Integration` button on the Applications page: + +![enter image description here][3] + +Choose SAML 2.0 as the sign-in method: + +![enter image description here][4] + +Choose **Baserow** as the app name and upload the logo for the application: + +![enter image description here][5] + +Next, retrieve your ***Default Relay State URL*** and ***Single Sign On URL*** from the admin settings modal in Baserow, following the [steps in this guide](/user-docs/enable-single-sign-on-sso#add-providers-for-sso-saml). + +To Configure SAML in Okta, add your `Single Sign On URL` in the first two fields (”Single sign on URL” and “Audience URI (SP Entity ID)”). + +Add your `Default Relay State URL` in the “Default Relay State” field. + +Create 3 attribute statements with values as such: + +| Field name | Value | +| --- | --- | +| user.email | user.email | +| user.first_name | user.firstName | +| user.last_name | user.lastName | + +Set all other fields like in the image below: + +![enter image description here][6] + +Click ‘**Next**’ to complete the configuration. + +Once the app has been created, assign it to people from the ‘Assignments’ tab of the Baserow Okta application. This permits these people to send the user information from Okta to Baserow to create/log in to the account. + +![enter image description here][7] + +To ensure that the sign in works properly on Baserow, set the email domain associated with this app and paste the Identity provider metadata into Baserow. + +The metadata can be found in the ‘Sign On’ tab. Scroll to “SAML Signing Certificates” section and then choose a certificate type with active status. From the actions dropdown of the active certificate, click “View IdP metadata”. + +![enter image description here][8] + +After you've accessed the information from the IdP Metadata, copy and paste the information from Okta into Baserow. + +## Connect Okta to your Baserow Account + +Head back to Baserow Admin > Authentication > Provider. + +Configure OneLogin by inputting the domain and metadata information into the corresponding fields in your Baserow Admin Dashboard, following the [steps in this guide](/user-docs/enable-single-sign-on-sso#add-providers-for-sso-saml). + +You should be able to log in with OneLogin after completing these steps by visiting your Baserow server login page. Your users will now be taken to a OneLogin sign-in flow when they attempt to log into Baserow. After logging in with their OneLogin credentials, they will be redirected to the app. + +![enter image description here][9] + +## Understanding Baserow's authentication system + +By default, Baserow restricts users to logging in only with the same authentication method they used for signing up. For instance, if a user creates an account with a username and password, they won't be able to log in through SSO without further configuration. + +## Troubleshooting error for SSO Login + +You might encounter an error message — ""Something went wrong: please use the provider that you originally signed up with"" — when you attempt to log in via SSO. + +This error message indicates a conflict between your initial sign-up method and your attempt to log in via SSO after initially signing up for Baserow with a username and password. + +Here are the primary options to address this error: + +**Option 1: Enable multiple authentication methods** + +Set the environment variable `BASEROW_ALLOW_MULTIPLE_SSO_PROVIDERS_FOR_SAME_ACCOUNT=true`. After setting this variable, restart the Baserow instance. This allows users to log in with either a password or SSO. + +This option **increases security risk**, especially if you have multiple OAuth providers enabled. An attacker who gains access to a user's account on any external provider could potentially use that access to log in to the associated Baserow account. + +> For optimal security, we recommend maintaining consistent authentication methods unless necessary. If enabling multiple login methods is essential, implement additional security measures to mitigate potential risks. + +**Option 2: Maintain consistent authentication method** + +Users can continue logging in with the authentication method they signed up with. This avoids changing Baserow's default behavior and maintains existing security measures. + +**Option 3: Delete user from [Admin panel](/user-docs/enterprise-admin-panel) and re-login via SSO** + +You can delete the user from the Baserow [admin panel](/user-docs/enterprise-admin-panel). Upon logging in via SSO, Baserow will recreate the user, automatically setting SSO as their default authentication method. + +Deleting the user permanently removes all their associated data within Baserow. This option should only be considered if data loss is acceptable and after ensuring all data is backed up elsewhere. + +Always prioritize data security when modifying your authentication settings. + +## Related content + + - [Single Sign On (SSO) overview](/user-docs/single-sign-on-sso-overview). + - [Baserow Enterprise plan](/user-docs/enterprise-license-overview). + - [Enable SSO in the admin panel](/user-docs/enable-single-sign-on-sso). + - [Email and password authentication](/user-docs/email-and-password-authentication). + +--- + + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we’re ready to assist you. + +   [Ask the Baserow community](https://community.baserow.io) + +   [Contact support](https://baserow.io/contact) for questions about Baserow or help with your account. + + [1]: /user-docs/configure-openid-connect-for-oauth-2-sso + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/7e8f8d96-a885-452e-82b2-a97d8777a409/Screenshot_2022-11-04_at_06.30.49.png + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/8a72703c-84ed-4ff2-b5a5-655f9bc53299/Screenshot_2022-11-01_at_12.42.02.png + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/2ce28b13-2655-4551-a7cb-7fbb75a28fbb/Screenshot_2022-11-01_at_12.42.15.png + [5]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/8149d6e0-138a-476e-808d-aeeabebb881c/Screenshot_2022-11-01_at_12.42.43.png + [6]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/f8d9c159-0159-45b2-a6b1-404faceb8cdf/Screenshot_2022-11-01_at_12.44.23.png + [7]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/07c31b77-a626-4db5-a95e-f6ab7d76cd2e/Screenshot_2022-11-01_at_12.45.59.png + [8]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/bf108d7c-a40e-4acc-b484-245bc2622f23/Screenshot_2022-11-01_at_12.44.58.png + [9]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/a3fc6ba7-66b4-47d2-a09c-c62d321d5407/Screenshot_2022-11-04_at_07.02.25.png",,baserow_user_docs,https://baserow.io/user-docs/configure-sso-with-okta +95,Configure SSO with OneLogin,configure-sso-with-onelogin,Configure Baserow SSO with OneLogin,"# Configure single sign-on with OneLogin + +This guide is intended for [Admins](/user-docs/working-with-collaborators#set-the-permission-level-for-collaborators) setting up SSO SAML with OneLogin. OneLogin is a cloud-based identity and access management solution. + +When you configure Single Sign-on (SSO) with OneLogin, your users will be able to create and sign into their Baserow accounts using OneLogin. + +If you are looking for information on setting up SSO with other providers: + +- [Configure Azure AD for SAML SSO](/user-docs/configure-sso-with-azure-ad) +- [Configure Okta for SAML SSO](/user-docs/configure-sso-with-okta) +- [Configure Google for OAuth 2 SSO][1] +- [Configure Facebook for OAuth 2 SSO][2] +- [Configure GitHub for OAuth 2 SSO][3] +- [Configure GitLab for OAuth 2 SSO][4] +- [Configure OpenID Connect for OAuth 2 SSO][5] + +> Single Sign-On feature is a part of the Baserow Enterprise offering. Instance-wide features are only available on the self-hosted Enterprise plan. To learn more about the Baserow enterprise plan, [visit our pricing page](https://baserow.io/pricing). +> + +Here's how to set up OneLogin to sign in to your Baserow account. + +## Set up SSO SAML with OneLogin + +Log in to your [OneLogin](https://www.onelogin.com) account as an administrator. Click **Administration** on the toolbar to go to the Admin panel. + +To add apps to your company app catalog, go to **Applications > Applications** from the admin page then click on `Add App`: + +![enter image description here][6] + +Search and select the *SAML Custom Connector (Advanced)*: + +![enter image description here][7] + +Enter *Baserow* as the **Display Name** of the new app, and make sure **Visible in portal** is on. Upload icon and add a description to the new SAML connector. + +![enter image description here][8] + +Click **Save.** You'll find a new left-side navigation menu after saving. Click **Configuration** in the sidebar menu. + +Next, log in to Baserow. Go to the Admin > Authentication > Provider. Retrieve your ***Default Relay State URL*** and ***Single Sign On URL*** from your Baserow admin settings modal, following the [steps in this guide](/user-docs/enable-single-sign-on-sso#add-providers-for-sso-saml). + +In OneLogin configuration tab, paste your Baserow `Default Relay State URL` in the `RelayState` field. + +Paste your `Single Sign On URL` in the next four fields as shown below. + +| Baserow value | Corresponding OneLogin Configuration field | +| --- | --- | +| Default Relay State URL | RelayState | +| Single Sign On URL | Audience (EntityID) | +| Single Sign On URL | Recipient | +| Single Sign On URL | ACS (Consumer) URL Validator* | +| Single Sign On URL | ACS (Consumer) URL* | + +Convert your ***Single Sign On URL*** into a regular expression and paste that into the **ACS (Consumer) URL Validator*** field. For information on regular expression, [visit this link](https://onelogin.service-now.com/support?sys_id=93f95543db109700d5505eea4b96198f&view=sp&id=kb_article&table=kb_knowledge). Add the required symbols in the ACS (Consumer) URL Validator* field as shown in the picture below to make it a valid regex: + +![enter image description here][9] + +Set the next set of configuration fields as shown below: + +| OneLogin field | Value | +| --- | --- | +| SAML initiator | OneLogin | +| SAML nameID format | Email | +| SAML issuer type | Specific | +| SAML signature element | Both | +| SAML encryption method | AES-128-CBC | +| Generate AttributeValue tag for empty values | ☑ | +| SAML sessionNotOnOrAfter | 1140 | + +![enter image description here][10] + +Once you're done, click **Save** to store the app settings. + +After saving, click on the **Parameters** tab. Then, click the + icon to add 3 custom parameters. + +Assign the following field names and check **Include in SAML assertion. Click **Save** + to go to the next screen then select the corresponding values from the dropdown: + +| Field name | Value | +| --- | --- | +| user.email | Email | +| user.first_name | First Name | +| user.last_name | Last Name | + +Set the parameters that will be sent in the SAML response with values as shown below: + +![enter image description here][11] + +Once you're done, click **Save**. + +To configure the SAML provider in Baserow, you’ll need to download the SAML metadata from the “More Actions” menu in the *Applications* tab as shown below: + +![enter image description here][12] + +After you've accessed the information from the SAML Metadata, copy and paste the information from OneLogin into Baserow. + +## Connect OneLogin to your Baserow Account + +Head back to Baserow Admin > Authentication > Provider. + +Configure OneLogin by inputting the domain and metadata information into the corresponding fields in your Baserow Admin Dashboard, following the [steps in this guide](/user-docs/enable-single-sign-on-sso#add-providers-for-sso-saml). + +![enter image description here][13] + +You should be able to log in with OneLogin after completing these steps by visiting your Baserow servers login page. Your users will now be taken to a OneLogin sign-in flow when they attempt to log into Baserow. After logging in with their OneLogin credentials, they will be redirected to the app. + +![enter image description here][14] + +## Add users to access OneLogin + +You can grant your users access to the newly created application, either by adding to individual Users or by adding to Roles or Workspaces within OneLogin, depending on how you prefer to manage your Users there. + +To add users to this application, click on **Users** in the top bar menu item. + +Go to **Users > Users** and click the **New User** button to open the **User Info** page. On the **User Info** page, verify that the user is activated. Enter the user's name and email address, along with any other personal information you want to include. Click the **Save User** button. + +![enter image description here][15] + +## Understanding Baserow's authentication system + +By default, Baserow restricts users to logging in only with the same authentication method they used for signing up. For instance, if a user creates an account with a username and password, they won't be able to log in through SSO without further configuration. + +## Troubleshooting error for SSO Login + +You might encounter an error message — ""Something went wrong: please use the provider that you originally signed up with"" — when you attempt to log in via SSO. + +This error message indicates a conflict between your initial sign-up method and your attempt to log in via SSO after initially signing up for Baserow with a username and password. + +Here are the primary options to address this error: + +**Option 1: Enable multiple authentication methods** + +Set the environment variable `BASEROW_ALLOW_MULTIPLE_SSO_PROVIDERS_FOR_SAME_ACCOUNT=true`. After setting this variable, restart the Baserow instance. This allows users to log in with either a password or SSO. + +This option **increases security risk**, especially if you have multiple OAuth providers enabled. An attacker who gains access to a user's account on any external provider could potentially use that access to log in to the associated Baserow account. + +> For optimal security, we recommend maintaining consistent authentication methods unless necessary. If enabling multiple login methods is essential, implement additional security measures to mitigate potential risks. + +**Option 2: Maintain consistent authentication method** + +Users can continue logging in with the authentication method they signed up with. This avoids changing Baserow's default behavior and maintains existing security measures. + +**Option 3: Delete user from [Admin panel](/user-docs/enterprise-admin-panel) and re-login via SSO** + +You can delete the user from the Baserow [admin panel](/user-docs/enterprise-admin-panel). Upon logging in via SSO, Baserow will recreate the user, automatically setting SSO as their default authentication method. + +Deleting the user permanently removes all their associated data within Baserow. This option should only be considered if data loss is acceptable and after ensuring all data is backed up elsewhere. + +Always prioritize data security when modifying your authentication settings. + +## Related content + + - [Single Sign On (SSO) overview](/user-docs/single-sign-on-sso-overview). + - [Baserow Enterprise plan](/user-docs/enterprise-license-overview). + - [Enable SSO in the admin panel](/user-docs/enable-single-sign-on-sso). + - [Email and password authentication](/user-docs/email-and-password-authentication). + +--- + + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we’re ready to assist you. + +   [Ask the Baserow community](https://community.baserow.io) + +   [Contact support](https://baserow.io/contact) for questions about Baserow or help with your account. + + [1]: /user-docs/configure-google-for-oauth-2-sso + [2]: /user-docs/configure-facebook-for-oauth-2-sso + [3]: /user-docs/configure-github-for-oauth-2-sso + [4]: /user-docs/configure-gitlab-for-oauth-2-sso + [5]: /user-docs/configure-openid-connect-for-oauth-2-sso + [6]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/b29a4448-f4eb-473e-a00d-54548c33d5b7/Screenshot_2022-11-01_at_16.19.54.png + [7]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/3e2dfd17-3092-4b10-9073-0e82b90bfebc/Screenshot_2022-11-01_at_16.54.27.png + [8]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/b8450668-0805-48a4-979a-8eaa8bd4fc2f/Screenshot_2022-11-01_at_16.55.02.png + [9]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/6d4620c2-4270-4575-95ca-ebd480f1931b/Screenshot_2022-11-01_at_16.56.20.png + [10]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/764d7e2c-5f84-4c31-b377-8be6d50bdc6c/Screenshot_2022-11-01_at_16.56.40.png + [11]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/0de4ee4c-c559-49ad-8a7a-de148098750f/Screenshot_2022-11-01_at_16.56.50.png + [12]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/57d65bd5-52bb-4400-8b75-e9a8684e9a5d/Screenshot_2022-11-01_at_16.57.46.png + [13]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/43422ceb-7dd3-42e9-894e-3fa8ce3d2137/Screenshot_2022-11-07_at_12.11.42.png + [14]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/38b75bc5-cd9a-48f7-a34d-38106358a570/Screenshot_2022-11-07_at_12.12.43.png + [15]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/141ffccd-2ce0-41b9-b5af-74a8fab538db/Screenshot_2022-11-07_at_12.18.17.png",,baserow_user_docs,https://baserow.io/user-docs/configure-sso-with-onelogin +96,Configure Google for SSO,configure-google-for-oauth-2-sso,Configure Google OAuth 2 single sign-on for Baserow,"# Set up Google OAuth 2 SSO in Baserow + +This guide is intended for [Admins](/user-docs/working-with-collaborators#set-the-permission-level-for-collaborators) setting up OAuth 2 SSO with Google. + +When you configure Single Sign-on (SSO) with Google, your users will be able to create and sign into their Baserow accounts using Google. + +If you are looking for information on setting up SSO with other providers: + +- [Configure Azure AD for SAML SSO](/user-docs/configure-sso-with-azure-ad) +- [Configure OneLogin for SAML SSO](/user-docs/configure-sso-with-onelogin) +- [Configure Okta for SAML SSO](/user-docs/configure-sso-with-okta) +- [Configure Facebook for OAuth 2 SSO][1] +- [Configure GitHub for OAuth 2 SSO][2] +- [Configure GitLab for OAuth 2 SSO][3] +- [Configure OpenID Connect for OAuth 2 SSO][4] + +> Single Sign-On feature is a part of the Baserow Enterprise offering. Instance-wide features are only available on the self-hosted Enterprise plan. To learn more about the Baserow enterprise plan, [visit our pricing page](https://baserow.io/pricing). +> + +Here's how to set up OAuth 2 SSO with Google to sign in to your Baserow account. + +## Set up OAuth 2 SSO with Google + +Sign in or create a Google account then sign into Google Cloud Console at [https://console.cloud.google.com/](https://console.cloud.google.com/). + +Create a new project or select an existing project in your organization: + +![enter image description here][5] + +Go to API & Services → Credentials: + +![enter image description here][6] + +Next, log in to Baserow. Go to the Admin > Authentication > Provider. Retrieve your ***Callback URL*** from your Baserow admin settings modal, following the [steps in this guide](/user-docs/enable-single-sign-on-sso#oauth-provider-configuration). + +Create a new credential for OAuth Client ID. A client ID is used to identify a single app to Google's OAuth servers. + +- Choose ***Web application*** as the Application type. +- Fill in Name. +- Add a URI under Authorized redirect URIs. This is the Baserow Callback URL you will find in the Baserow Provider Settings where you create or edit the authentication provider. + +![enter image description here][7] + +Click the ‘Create’ button. + +Once created, you will be able to obtain Client ID and Client secret: + +![enter image description here][8] + +After you've accessed the information from the Credentials, copy and paste the information from Google into Baserow. + +## Connect Google to your Baserow Account + +Head back to Baserow Admin > Authentication > Provider. + +Configure Google by inputting the Client ID and secret information into the corresponding fields in your Baserow Admin Dashboard, following the [steps in this guide](/user-docs/enable-single-sign-on-sso#oauth-provider-configuration). + +![enter image description here][9] + +You should be able to log in with Google after completing these steps by visiting your Baserow servers login page. Your users will now be taken to a Google sign-in flow when they attempt to log into Baserow. After logging in with their Google credentials, they will be redirected to the app. + +![enter image description here][10] + +## Understanding Baserow's authentication system + +By default, Baserow restricts users to logging in only with the same authentication method they used for signing up. For instance, if a user creates an account with a username and password, they won't be able to log in through SSO without further configuration. + +## Troubleshooting error for SSO Login + +You might encounter an error message — ""Something went wrong: please use the provider that you originally signed up with"" — when you attempt to log in via SSO. + +This error message indicates a conflict between your initial sign-up method and your attempt to log in via SSO after initially signing up for Baserow with a username and password. + +Here are the primary options to address this error: + +**Option 1: Enable multiple authentication methods** + +Set the environment variable `BASEROW_ALLOW_MULTIPLE_SSO_PROVIDERS_FOR_SAME_ACCOUNT=true`. After setting this variable, restart the Baserow instance. This allows users to log in with either a password or SSO. + +This option **increases security risk**, especially if you have multiple OAuth providers enabled. An attacker who gains access to a user's account on any external provider could potentially use that access to log in to the associated Baserow account. + +> For optimal security, we recommend maintaining consistent authentication methods unless necessary. If enabling multiple login methods is essential, implement additional security measures to mitigate potential risks. + +**Option 2: Maintain consistent authentication method** + +Users can continue logging in with the authentication method they signed up with. This avoids changing Baserow's default behavior and maintains existing security measures. + +**Option 3: Delete user from [Admin panel](/user-docs/enterprise-admin-panel) and re-login via SSO** + +You can delete the user from the Baserow [admin panel](/user-docs/enterprise-admin-panel). Upon logging in via SSO, Baserow will recreate the user, automatically setting SSO as their default authentication method. + +Deleting the user permanently removes all their associated data within Baserow. This option should only be considered if data loss is acceptable and after ensuring all data is backed up elsewhere. + +Always prioritize data security when modifying your authentication settings. + +## Related content + + - [Single Sign On (SSO) overview](/user-docs/single-sign-on-sso-overview). + - [Baserow Enterprise plan](/user-docs/enterprise-license-overview). + - [Enable SSO in the admin panel](/user-docs/enable-single-sign-on-sso). + - [Email and password authentication](/user-docs/email-and-password-authentication). + +--- + + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we’re ready to assist you. + +   [Ask the Baserow community](https://community.baserow.io) + +   [Contact support](https://baserow.io/contact) for questions about Baserow or help with your account. + + [1]: /user-docs/configure-facebook-for-oauth-2-sso + [2]: /user-docs/configure-github-for-oauth-2-sso + [3]: /user-docs/configure-gitlab-for-oauth-2-sso + [4]: /user-docs/configure-openid-connect-for-oauth-2-sso + [5]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/800b03b7-e3af-4f35-9369-89988389bfc0/Screenshot_2022-11-04_at_12.12.23.png + [6]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/4ff73925-a71e-483c-9377-b757936f151e/4383a565339f10ee5cd4bf6097005a9938b90525.webp + [7]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/16ffcb4c-5119-4e2e-8f5b-886e16581bb8/Screenshot_2022-11-04_at_14.17.36.png + [8]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/ef63b71e-7557-40df-9348-40e00455e8c1/Screenshot_2022-11-04_at_14.18.36.png + [9]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/e1b155da-fffb-465f-83a1-1186f0d02831/Screenshot_2022-11-07_at_15.30.58.png + [10]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/3a831490-1029-4c54-b8d1-3484761dfea3/Screenshot_2022-11-04_at_14.48.37.png",,baserow_user_docs,https://baserow.io/user-docs/configure-google-for-oauth-2-sso +97,Configure Facebook for SSO,configure-facebook-for-oauth-2-sso,Set up Facebook login with Baserow OAuth 2,"# Configure Facebook OAuth 2 SSO in Baserow + +This guide is intended for [Admins](/user-docs/working-with-collaborators#set-the-permission-level-for-collaborators) setting up OAuth 2 SSO with Facebook. + +When you configure Single Sign-on (SSO) with Facebook, your users will be able to create and sign into their Baserow accounts using Facebook. + +If you are looking for information on setting up SSO with other providers: + +- [Configure Azure AD for SAML SSO](/user-docs/configure-sso-with-azure-ad) +- [Configure OneLogin for SAML SSO](/user-docs/configure-sso-with-onelogin) +- [Configure Okta for SAML SSO](/user-docs/configure-sso-with-okta) +- [Configure Google for OAuth 2 SSO](/user-docs/configure-google-for-oauth-2-sso) +- [Configure GitHub for OAuth 2 SSO][1] +- [Configure GitLab for OAuth 2 SSO][2] +- [Configure OpenID Connect for OAuth 2 SSO][3] + +> Single Sign-On feature is a part of the Baserow Enterprise offering. Instance-wide features are only available on the self-hosted Enterprise plan. To learn more about the Baserow enterprise plan, [visit our pricing page](https://baserow.io/pricing). +> + +Here's how to set up OAuth 2 SSO with Facebook to sign in to your Baserow account. + +## Set up OAuth 2 SSO with Facebook + +Sign in or create a Facebook account then sign in to Meta for Developers apps at [https://developers.facebook.com/apps/](https://developers.facebook.com/apps/). + +Create a new app or select an existing app: + +![enter image description here][4] + +Choose the *Business app* type or another type that works for you. The app type can't be changed after your app is created. + +![enter image description here][5] + +Fill in the App name as **Baserow** and Contact email, then click the **Create app** button. + +![enter image description here][6] + +Next, log in to Baserow. Go to the Admin > Authentication > Provider. Retrieve your ***Callback URL*** from your Baserow admin settings modal, following the [steps in this guide](/user-docs/enable-single-sign-on-sso#oauth-provider-configuration). + +To be able to load this URL, add all domains and sub-domains of your app to the App Domains field in your app settings. + +From the sidebar, navigate to **app products > Facebook login > settings** and add your redirect URL under **Valid OAuth Redirect URIs.** This is the Baserow Callback URL you will find in the Baserow Provider Settings where you create or edit the authentication provider. + +![enter image description here][7] + +Save your changes. + +From the Facebook app dashboard, navigate to Settings → Basic. + +![enter image description here][8] + +In the app Settings > Basic, click on ""Add Platform"" then select ""Website"". Enter the Callback URL as the Site URL(s) in the field that appears. + +![enter image description here][9] + +Then click on **Save changes**. + +To integrate Baserow with Facebook, + +- Obtain App ID, this will be the Baserow Client ID. +- Obtain App secret, this will be the Baserow Secret. + +![enter image description here][10] + +Set App Mode from Development to Live. + +After you've accessed this information from the application, copy and paste the information from Facebook into Baserow. + +## Connect Facebook to your Baserow Account + +Head back to Baserow Admin > Authentication > Provider. + +Configure Facebook by inputting the **Client ID** and **Secret** information into the corresponding fields in your Baserow Admin Dashboard, following the [steps in this guide](/user-docs/enable-single-sign-on-sso#oauth-provider-configuration). + +![enter image description here][11] + +You should be able to log in with Facebook after completing these steps by visiting your Baserow servers login page. Your users will now be taken to a Facebook sign-in flow when they attempt to log into Baserow. After logging in with their Facebook credentials, they will be redirected to the app. + +![enter image description here][12] + +## Understanding Baserow's authentication system + +By default, Baserow restricts users to logging in only with the same authentication method they used for signing up. For instance, if a user creates an account with a username and password, they won't be able to log in through SSO without further configuration. + +## Troubleshooting error for SSO Login + +You might encounter an error message — ""Something went wrong: please use the provider that you originally signed up with"" — when you attempt to log in via SSO. + +This error message indicates a conflict between your initial sign-up method and your attempt to log in via SSO after initially signing up for Baserow with a username and password. + +Here are the primary options to address this error: + +**Option 1: Enable multiple authentication methods** + +Set the environment variable `BASEROW_ALLOW_MULTIPLE_SSO_PROVIDERS_FOR_SAME_ACCOUNT=true`. After setting this variable, restart the Baserow instance. This allows users to log in with either a password or SSO. + +This option **increases security risk**, especially if you have multiple OAuth providers enabled. An attacker who gains access to a user's account on any external provider could potentially use that access to log in to the associated Baserow account. + +> For optimal security, we recommend maintaining consistent authentication methods unless necessary. If enabling multiple login methods is essential, implement additional security measures to mitigate potential risks. + +**Option 2: Maintain consistent authentication method** + +Users can continue logging in with the authentication method they signed up with. This avoids changing Baserow's default behavior and maintains existing security measures. + +**Option 3: Delete user from [Admin panel](/user-docs/enterprise-admin-panel) and re-login via SSO** + +You can delete the user from the Baserow [admin panel](/user-docs/enterprise-admin-panel). Upon logging in via SSO, Baserow will recreate the user, automatically setting SSO as their default authentication method. + +Deleting the user permanently removes all their associated data within Baserow. This option should only be considered if data loss is acceptable and after ensuring all data is backed up elsewhere. + +Always prioritize data security when modifying your authentication settings. + +## Related content + + - [Single Sign On (SSO) overview](/user-docs/single-sign-on-sso-overview). + - [Baserow Enterprise plan](/user-docs/enterprise-license-overview). + - [Enable SSO in the admin panel](/user-docs/enable-single-sign-on-sso). + - [Email and password authentication](/user-docs/email-and-password-authentication). + +--- + + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we’re ready to assist you. + +   [Ask the Baserow community](https://community.baserow.io) + +   [Contact support](https://baserow.io/contact) for questions about Baserow or help with your account. + + + [1]: /user-docs/configure-github-for-oauth-2-sso + [2]: /user-docs/configure-gitlab-for-oauth-2-sso + [3]: /user-docs/configure-openid-connect-for-oauth-2-sso + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/7b10cf62-2b6a-427a-a369-519d3c4d1937/Screenshot_2022-11-07_at_14.14.23.png + [5]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/61c91968-749d-4a1d-8da8-814e627e5dc1/Screenshot_2022-11-07_at_14.15.27.png + [6]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/7c267d51-8912-4fa6-bb93-d6e0ba589658/Screenshot_2022-11-07_at_14.16.51.png + [7]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/ffba17d9-1578-4195-9472-a242b039af04/Screenshot_2022-11-07_at_14.48.24.png + [8]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/c1bf122c-10ff-4483-95f9-ed83199d8f60/Screenshot_2022-11-07_at_14.19.20.png + [9]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/f1136711-129d-4adb-8ebb-adbb6ee443ff/Screenshot_2022-11-07_at_14.26.47.png + [10]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/d0cf2871-a948-4e95-8739-78cdce5f9984/Screenshot_2022-11-07_at_14.28.08.png + [11]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/a2f2fc8f-6ed6-4ca0-a854-aa3f78e34807/Screenshot_2022-11-07_at_14.29.37.png + [12]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/5e95edb4-e3a9-4ed1-afd4-c41baaf9e882/Screenshot_2022-11-07_at_14.30.15.png",,baserow_user_docs,https://baserow.io/user-docs/configure-facebook-for-oauth-2-sso +98,Configure GitHub for SSO,configure-github-for-oauth-2-sso,Baserow GitHub OAuth 2 SSO setup guide,"# Set up GitHub for OAuth 2 SSO + +This guide is intended for [Admins](/user-docs/working-with-collaborators#set-the-permission-level-for-collaborators) setting up OAuth 2 SSO with GitHub. + +When you configure Single Sign-on (SSO) with GitHub, your users will be able to create and sign into their Baserow accounts using GitHub. + +If you are looking for information on setting up SSO with other providers: + +- [Configure Azure AD for SAML SSO](/user-docs/configure-sso-with-azure-ad) +- [Configure OneLogin for SAML SSO](/user-docs/configure-sso-with-onelogin) +- [Configure Okta for SAML SSO](/user-docs/configure-sso-with-okta) +- [Configure Google for OAuth 2 SSO](/user-docs/configure-google-for-oauth-2-sso) +- [Configure Facebook for OAuth 2 SSO](/user-docs/configure-facebook-for-oauth-2-sso) +- [Configure GitLab for OAuth 2 SSO][1] +- [Configure OpenID Connect for OAuth 2 SSO][2] + +> Single Sign-On feature is a part of the Baserow Enterprise offering. Instance-wide features are only available on the self-hosted Enterprise plan. To learn more about the Baserow enterprise plan, [visit our pricing page](/pricing). +> + +Here's how to set up OAuth 2 SSO with GitHub to sign in to your Baserow account. + +## Set up OAuth 2 SSO with GitHub + +Sign in or create a GitHub account. Go to Settings → Developer settings → OAuth Apps at [https://github.com/settings/developers](https://github.com/settings/developers). + +![enter image description here][3] + +Create a new OAuth application in GitHub by clicking the **Register a new application** button. + +In the new OAuth application on GitHub, + + 1. Input the Application name as ""Baserow"". + 2. Input the Homepage URL. This will be your public Baserow URL. + 3. Input the Authorization callback URL. This is the Baserow Callback URL in the Baserow Provider Settings where you create or edit the authentication provider. + + Log in to Baserow. Go to Admin > Authentication > Provider. Retrieve your ***Callback URL*** from your Baserow admin settings modal, following the [steps in this guide](/user-docs/enable-single-sign-on-sso#oauth-provider-configuration). + + ![enter image description here][4] + + 4. Click the **Register application** button to save your changes. + + 5. To integrate Baserow with GitHub, generate a new secret by clicking on **Generate a new client secret** button. + + ![enter image description here][5] + + 6. Once created, use the credentials to configure a new GitHub provider in Baserow: + +- Client ID is the Baserow Client ID. +- Client secret is the Baserow Secret. + +![Create a new OAuth application in GitHub][6] + +After you've accessed this information from the application, copy and paste the information from GitHub into Baserow. + +## Connect GitHub to your Baserow Account + +Head back to Baserow Admin > Authentication > Provider. + +To set up GitHub integration, simply enter your *Client ID* and *Secret* information into the designated fields in your Baserow Admin Dashboard. [Follow the steps outlined in our guide][13]. + +![enter image description here][7] + +You should be able to log in to Baserow with GitHub after completing these steps. Simply visit your Baserow server's login page, and you'll find the option to log in with GitHub. + +When your users try to access Baserow, they'll be seamlessly redirected to GitHub's sign-in flow. After securely logging in with their GitHub credentials, they'll be redirected back to the Baserow app. + +![enter image description here][8] + +## Understanding Baserow's authentication system + +By default, Baserow restricts users to logging in only with the same authentication method they used for signing up. For instance, if a user creates an account with a username and password, they won't be able to log in through SSO without further configuration. + +## Troubleshooting error for SSO Login + +You might encounter an error message — ""Something went wrong: please use the provider that you originally signed up with"" — when you attempt to log in via SSO. + +This error message indicates a conflict between your initial sign-up method and your attempt to log in via SSO after initially signing up for Baserow with a username and password. + +Here are the primary options to address this error: + +**Option 1: Enable multiple authentication methods** + +Set the environment variable `BASEROW_ALLOW_MULTIPLE_SSO_PROVIDERS_FOR_SAME_ACCOUNT=true`. After setting this variable, restart the Baserow instance. This allows users to log in with either a password or SSO. + +This option **increases security risk**, especially if you have multiple OAuth providers enabled. An attacker who gains access to a user's account on any external provider could potentially use that access to log in to the associated Baserow account. + +> For optimal security, we recommend maintaining consistent authentication methods unless necessary. If enabling multiple login methods is essential, implement additional security measures to mitigate potential risks. + +**Option 2: Maintain consistent authentication method** + +Users can continue logging in with the authentication method they signed up with. This avoids changing Baserow's default behavior and maintains existing security measures. + +**Option 3: Delete user from [Admin panel](/user-docs/enterprise-admin-panel) and re-login via SSO** + +You can delete the user from the Baserow [admin panel](/user-docs/enterprise-admin-panel). Upon logging in via SSO, Baserow will recreate the user, automatically setting SSO as their default authentication method. + +Deleting the user permanently removes all their associated data within Baserow. This option should only be considered if data loss is acceptable and after ensuring all data is backed up elsewhere. + +Always prioritize data security when modifying your authentication settings. + +## Related content + + - [Single Sign On (SSO) overview][9]. + - [Baserow Enterprise plan][10]. + - [Enable SSO in the admin panel][11]. + - [Email and password authentication][12]. + +--- + + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we’re ready to assist you. + +   [Ask the Baserow community](https://community.baserow.io) + +   [Contact support](/contact) for questions about Baserow or help with your account. + + + [1]: /user-docs/configure-gitlab-for-oauth-2-sso + [2]: /user-docs/configure-openid-connect-for-oauth-2-sso + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/3c3c7900-28ae-4d65-a04e-75234f5788f8/Screenshot_2022-11-07_at_15.01.41.png + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/83857cd9-ee3a-4ea7-a21c-f4fd69acbc17/Screenshot_2022-11-07_at_15.08.01.png + [5]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/19e21f07-dcb5-4710-9321-cbcd15e9ff12/Screenshot_2022-11-07_at_15.10.10.png + [6]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/457c10f1-e480-4132-b7aa-053d274d8907/Screenshot%202023-07-18%20at%2011.07.05.png + [7]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/da1f821b-4cbb-429b-bcc6-2c186d601825/Screenshot_2022-11-07_at_15.11.46.png + [8]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/1cd2f1db-be25-4953-be00-76605aab583e/Screenshot_2022-11-07_at_15.12.42.png + [9]: /user-docs/single-sign-on-sso-overview + [10]: /user-docs/enterprise-license-overview + [11]: /user-docs/enable-single-sign-on-sso + [12]: /user-docs/email-and-password-authentication + [13]: /user-docs/enable-single-sign-on-sso#oauth-provider-configuration",,baserow_user_docs,https://baserow.io/user-docs/configure-github-for-oauth-2-sso +99,Configure GitLab for SSO,configure-gitlab-for-oauth-2-sso,Baserow GitLab OAuth 2 SSO setup guide,"# Set up GitLab OAuth 2 SSO in Baserow + +This guide is intended for [Admins](/user-docs/working-with-collaborators#set-the-permission-level-for-collaborators) setting up OAuth 2 SSO with GitLab. + +When you configure Single Sign-on (SSO) with GitLab, your users will be able to create and sign into their Baserow accounts using GitLab. + +If you are looking for information on setting up SSO with other providers: + +- [Configure Azure AD for SAML SSO](/user-docs/configure-sso-with-azure-ad) +- [Configure OneLogin for SAML SSO](/user-docs/configure-sso-with-onelogin) +- [Configure Okta for SAML SSO](/user-docs/configure-sso-with-okta) +- [Configure Google for OAuth 2 SSO](/user-docs/configure-google-for-oauth-2-sso) +- [Configure Facebook for OAuth 2 SSO](/user-docs/configure-facebook-for-oauth-2-sso) +- [Configure GitHub for OAuth 2 SSO](/user-docs/configure-github-for-oauth-2-sso) +- [Configure OpenID Connect for OAuth 2 SSO][1] + +> Single Sign-On feature is a part of the Baserow Enterprise offering. Instance-wide features are only available on the self-hosted Enterprise plan. To learn more about the Baserow enterprise plan, [visit our pricing page](/pricing). +> + +Here's how to set up OAuth 2 SSO with GitLab to sign in to your Baserow account. + +## Set up OAuth 2 SSO with GitLab + +Sign in or create a [GitLab](https://about.gitlab.com/) account. Go to User settings → Applications at [https://gitlab.com/-/profile/applications](https://gitlab.com/-/profile/applications). + +Add a new application: + +![enter image description here][2] + +Next, log in to Baserow. Go to the Admin > Authentication > Provider. Retrieve your ***Callback URL*** from your Baserow admin settings modal, following the [steps in this guide](/user-docs/enable-single-sign-on-sso#oauth-provider-configuration). + +To set up the new application, + +- Fill in the Application name as **Baserow** +- Fill in the Redirect URI. This is the Baserow Callback URL you will find in the Baserow Provider Settings where you create or edit the authentication provider. +- Set the Confidential checkbox. +- Allow the `read_user` scope. + +![enter image description here][3] + +Click the **Save application** button. + +Once created, you will use the credentials to configure a new GitLab provider in Baserow: + +- Application ID is the Baserow Client ID. +- Secret is the Baserow Secret. + +![enter image description here][4] + +After you've accessed this information from the application, copy and paste the information from GitLab into Baserow. + +## Connect GitLab to your Baserow Account + +Head back to Baserow Admin > Authentication > Provider. + +Configure GitLab by inputting the Client ID and secret information into the corresponding fields in your Baserow Admin Dashboard, following the [steps in this guide](/user-docs/enable-single-sign-on-sso#oauth-provider-configuration). + +![enter image description here][5] + +You should be able to log in with GitLab after completing these steps by visiting your Baserow servers login page. Your users will now be taken to a GitLab sign-in flow when they attempt to log into Baserow. After logging in with their GitLab credentials, they will be redirected to the app. + +![enter image description here][6] + +## Understanding Baserow's authentication system + +By default, Baserow restricts users to logging in only with the same authentication method they used for signing up. For instance, if a user creates an account with a username and password, they won't be able to log in through SSO without further configuration. + +## Troubleshooting error for SSO Login + +You might encounter an error message — ""Something went wrong: please use the provider that you originally signed up with"" — when you attempt to log in via SSO. + +This error message indicates a conflict between your initial sign-up method and your attempt to log in via SSO after initially signing up for Baserow with a username and password. + +Here are the primary options to address this error: + +**Option 1: Enable multiple authentication methods** + +Set the environment variable `BASEROW_ALLOW_MULTIPLE_SSO_PROVIDERS_FOR_SAME_ACCOUNT=true`. After setting this variable, restart the Baserow instance. This allows users to log in with either a password or SSO. + +This option **increases security risk**, especially if you have multiple OAuth providers enabled. An attacker who gains access to a user's account on any external provider could potentially use that access to log in to the associated Baserow account. + +> For optimal security, we recommend maintaining consistent authentication methods unless necessary. If enabling multiple login methods is essential, implement additional security measures to mitigate potential risks. + +**Option 2: Maintain consistent authentication method** + +Users can continue logging in with the authentication method they signed up with. This avoids changing Baserow's default behavior and maintains existing security measures. + +**Option 3: Delete user from [Admin panel](/user-docs/enterprise-admin-panel) and re-login via SSO** + +You can delete the user from the Baserow [admin panel](/user-docs/enterprise-admin-panel). Upon logging in via SSO, Baserow will recreate the user, automatically setting SSO as their default authentication method. + +Deleting the user permanently removes all their associated data within Baserow. This option should only be considered if data loss is acceptable and after ensuring all data is backed up elsewhere. + +Always prioritize data security when modifying your authentication settings. + +## Related content + + - [Single Sign On (SSO) overview][7]. + - [Baserow Enterprise plan][8]. + - [Enable SSO in the admin panel][9]. + - [Email and password authentication][10]. + +--- + + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account. + + + [1]: /user-docs/configure-openid-connect-for-oauth-2-sso + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/64147fe6-1fa4-44bf-b21b-bb3e080d42b5/Screenshot_2022-11-07_at_15.21.47.png + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/020644ba-019d-45fc-96be-3a723bad606d/Screenshot_2022-11-07_at_15.25.26.png + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/b5db7f64-d64a-440d-9942-e8dc61675337/Screenshot_2022-11-07_at_15.28.19.png + [5]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/f9e2b6f4-8ac0-4a8c-86f7-513f1f0a218e/Screenshot_2022-11-07_at_15.30.00.png + [6]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/55cecad5-0a22-4586-a7af-a3b89924fe46/Screenshot_2022-11-07_at_15.30.34.png + [7]: /user-docs/single-sign-on-sso-overview + [8]: /user-docs/enterprise-license-overview + [9]: /user-docs/enable-single-sign-on-sso + [10]: /user-docs/email-and-password-authentication",,baserow_user_docs,https://baserow.io/user-docs/configure-gitlab-for-oauth-2-sso +100,Configure OpenID Connect,configure-openid-connect-for-oauth-2-sso,Baserow single sign-on with OpenID Connect,"# Configure OpenID Connect for Baserow SSO + +This guide is intended for [Admins](/user-docs/working-with-collaborators#set-the-permission-level-for-collaborators) setting up OAuth 2 SSO with OpenID Connect. + +OpenID Connect (OIDC) is an open authentication protocol on top of the OAuth 2.0 framework. OIDC is a consumer-focused standard that enables users to access third-party websites with just one sign-on (SSO). + +> Single Sign-On feature is a part of the Baserow Enterprise offering. Instance-wide features are only available on the self-hosted Enterprise plan. To learn more about the Baserow enterprise plan, [visit our pricing page](https://baserow.io/pricing). + +If you are looking for information on setting up SSO with other providers: + +- [Configure Azure AD for SAML SSO](/user-docs/configure-sso-with-azure-ad) +- [Configure OneLogin for SAML SSO](/user-docs/configure-sso-with-onelogin) +- [Configure Okta for SAML SSO](/user-docs/configure-sso-with-okta) +- [Configure Google for OAuth 2 SSO](/user-docs/configure-google-for-oauth-2-sso) +- [Configure Facebook for OAuth 2 SSO](/user-docs/configure-facebook-for-oauth-2-sso) +- [Configure GitHub for OAuth 2 SSO](/user-docs/configure-github-for-oauth-2-sso) +- [Configure GitLab for OAuth 2 SSO](/user-docs/configure-gitlab-for-oauth-2-sso) + +When you configure Single Sign-on (SSO) with OpenID Connect, your users can create and sign into their Baserow accounts using OpenID Providers (OPs) such as an email service or social network to verify their identities. + +Based on the authentication carried out by an authorization server, you can receive basic profile information about the end user and validate the end user's identity. + +Here's how to set up OAuth 2 SSO with OpenID Connect to sign in to your Baserow account. + +## Set up OAuth 2 SSO with OpenID Connect + +Sign in or create an account with a provider of your choice. + +You must register your application with the IdP in order to let users log in using an OIDC Identity Provider. To do this, you must refer to the documentation provided by your IdP as it differs for each OIDC Identity Provider. + +Your OIDC Identity Provider will create a unique ID for the registered API during this procedure, typically referred to as a Client ID and Secret. + +Once created, you will use the credentials to configure a new OpenID Connect provider in Baserow: + +- Obtain the Provider’s Base URL. +- Obtain the Provider’s Client ID. +- Obtain the Provider’s Client Secret. +- Set Redirect URL. This is the Baserow Callback URL you will find in the Baserow Provider Settings where you create or edit the authentication provider. + +After you've accessed this information from the application, copy and paste the information from OpenID Connect into Baserow. + +## Connect OpenID Connect to your Baserow Account + +Log in to Baserow. Go to Admin > Authentication > Provider. Retrieve your ***Callback URL*** from your Baserow admin settings modal, following the [steps in this guide](/user-docs/enable-single-sign-on-sso#oauth-provider-configuration). + +![enter image description here][1] + +Configure OpenID Connect by inputting the URL, Client ID and Secret information into the corresponding fields in your Baserow Admin Dashboard, following the [steps in this guide](/user-docs/enable-single-sign-on-sso#oauth-provider-configuration). + +You should be able to log in with OpenID Connect after completing these steps by visiting your Baserow servers login page. Your users will now be taken to an OpenID Connect sign-in flow when they attempt to log into Baserow. After logging in with their OpenID Connect credentials, they will be redirected to the app. + +## Understanding Baserow's authentication system + +By default, Baserow restricts users to logging in only with the same authentication method they used for signing up. For instance, if a user creates an account with a username and password, they won't be able to log in through SSO without further configuration. + +## Troubleshooting error for SSO Login + +You might encounter an error message — ""Something went wrong: please use the provider that you originally signed up with"" — when you attempt to log in via SSO. + +This error message indicates a conflict between your initial sign-up method and your attempt to log in via SSO after initially signing up for Baserow with a username and password. + +Here are the primary options to address this error: + +**Option 1: Enable multiple authentication methods** + +Set the environment variable `BASEROW_ALLOW_MULTIPLE_SSO_PROVIDERS_FOR_SAME_ACCOUNT=true`. After setting this variable, restart the Baserow instance. This allows users to log in with either a password or SSO. + +This option **increases security risk**, especially if you have multiple OAuth providers enabled. An attacker who gains access to a user's account on any external provider could potentially use that access to log in to the associated Baserow account. + +> For optimal security, we recommend maintaining consistent authentication methods unless necessary. If enabling multiple login methods is essential, implement additional security measures to mitigate potential risks. + +**Option 2: Maintain consistent authentication method** + +Users can continue logging in with the authentication method they signed up with. This avoids changing Baserow's default behavior and maintains existing security measures. + +**Option 3: Delete user from [Admin panel](/user-docs/enterprise-admin-panel) and re-login via SSO** + +You can delete the user from the Baserow [admin panel](/user-docs/enterprise-admin-panel). Upon logging in via SSO, Baserow will recreate the user, automatically setting SSO as their default authentication method. + +Deleting the user permanently removes all their associated data within Baserow. This option should only be considered if data loss is acceptable and after ensuring all data is backed up elsewhere. + +Always prioritize data security when modifying your authentication settings. + +## Related content + + - [Single Sign On (SSO) overview][2]. + - [Baserow Enterprise plan][3]. + - [Enable SSO in the admin panel][4]. + - [Email and password authentication][5]. + +--- + + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we’re ready to assist you. + +   [Ask the Baserow community](https://community.baserow.io) + +   [Contact support](https://baserow.io/contact) for questions about Baserow or help with your account. + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/ea05ea09-eecf-4ca3-8171-5162d76a30f4/Screenshot_2022-11-07_at_16.02.14.png + [2]: /user-docs/single-sign-on-sso-overview + [3]: /user-docs/enterprise-license-overview + [4]: /user-docs/enable-single-sign-on-sso + [5]: /user-docs/email-and-password-authentication",,baserow_user_docs,https://baserow.io/user-docs/configure-openid-connect-for-oauth-2-sso +101,Role hierarchy,role-based-access-control-rbac,Baserow role hierarchy explained for access control,"# Understanding role hierarchy for access control + +Understanding role hierarchy is essential for designing secure, scalable permission structures that balance ease of management with precise access control. + +This guide covers how Baserow's role hierarchy system determines permissions, understand precedence rules when multiple roles conflict, and grasp the principles that govern access control across workspaces, databases, and tables. + + + +## Overview + +Baserow's role hierarchy creates a flexible permission system where access is determined by the most specific role assignment, with individual permissions always overriding team-based access. + +Rather than a flat permission model, Baserow uses levels of role assignment: [workspace][1], [database][2], and [table][3], allowing administrators to set broad defaults while making targeted exceptions. When a member has multiple roles from different sources, the hierarchy system automatically determines which permission applies. + + +## Permission levels from broad to specific + +``` +Workspace Level (Default baseline for all content) + ↓ overridden by +Database Level (Department or project-level exceptions) + ↓ overridden by +Table Level (Granular, specific restrictions) +``` + +**Principle:** More specific assignments always override broader ones. + +This structure lets you set generous defaults while protecting sensitive data at the appropriate specificity level. + +**Example:** Sarah has **Editor** role at workspace level, **Viewer** role on Finance Database, and **Admin** role on Budget Table. Sarah can edit everywhere except the Finance Database (view only), but has admin access specifically to the Budget Table. + + + +## Individual vs. team role precedence + +> **Individual member roles ALWAYS override team roles at the same level.** + +### Precedence order (highest to lowest priority) + +1. **Table-level individual role** (most specific + individual) +2. **Table-level team role** +3. **Database-level individual role** +4. **Database-level team role** +5. **Workspace-level individual role** +6. **Workspace-level team role** (least specific) +7. **No access** (no roles assigned) + +### Precedence examples + +| Individual Roles | Team Roles | Effective Permission | Why | +|------------------|------------|---------------------|-----| +| Workspace: Editor | Workspace: Admin via Team A | **Editor** | Individual workspace > team workspace | +| Database A: Viewer | Database A: Editor via Team A | **Viewer** | Individual database > team database | +| None | Workspace: Editor via Team A + Database A: Admin via Team B | **Admin on Database A**, Editor elsewhere | Highest team role wins, more specific beats general | +| Workspace: No Role | Workspace: Editor via Team A | **Editor** | Team provides access when individual has No Role | +| Table X: Admin, Workspace: Viewer | Workspace: Admin via Team A | **Admin on Table X**, Viewer elsewhere | Most specific individual role (table) wins | + + +## Role hierarchy principles + +### Principle 1: Specificity wins + +The most specific role assignment takes precedence, regardless of permission level. This allows you to lock down sensitive tables even for workspace admins. + +**Example:** A workspace member has **Admin** at workspace level, and **Viewer** on specific table. Viewer role applies to that table (table is more specific than workspace) + +### Principle 2: Individual overrides team + +A member's individual role assignment always beats roles inherited from team membership. This enables targeted restrictions for specific members within a team. + +**Example:** A workspace member has **Viewer** individually on Database A, and the member's team has **Admin** on Database A. The workspace member gets Viewer role (individual assignment wins) + +### Principle 3: Highest permission across teams + +When a member belongs to multiple teams with different roles at the same level, they receive the highest permission. This prevents accidentally limiting access through team memberships. + +**Example:** If a workspace member belongs to Team A (Viewer) and Team B (Editor) on Database X, the member gets the Editor role (higher permission wins) + +### Principle 4: ""No Role"" requires explicit access + +""No Role"" at the workspace level means zero default access; members need team membership or explicit database/table grants to access anything. This creates the ""least privilege"" security model, where all access is explicit. + +**Example:** A workspace member has **No Role** at workspace level, and has **Editor** on Database A via team. Editor access to Database A only, no access to other databases + + +## How roles are determined + +### Decision flowchart + +When a member tries to access a table, Baserow checks permissions in this order: + +``` +1. Does member have table-level individual role? + YES → Use that role ✓ + NO → Continue to step 2 + +2. Does member have table-level role via any team? + YES → Use highest team role ✓ + NO → Continue to step 3 + +3. Does member have database-level individual role? + YES → Use that role ✓ + NO → Continue to step 4 + +4. Does member have database-level role via any team? + YES → Use highest team role ✓ + NO → Continue to step 5 + +5. Does member have workspace-level individual role? + YES → Use that role ✓ + NO → Continue to step 6 + +6. Does member have workspace-level role via any team? + YES → Use highest team role ✓ + NO → No access ✗ +``` + +## Team hierarchies + +### Hierarchical team access + +Higher-level teams can access content owned by lower-level teams, but not vice versa. + +**Hierarchy structure:** +``` +Executive Team (Level 1) + └── Can access everything below + Department Leads (Level 2) + └── Can access everything below + Project Teams (Level 3) + └── Can access everything below + Contributors (Level 4) +``` + +Level 1 can view/edit Level 2, 3, and 4 content. Level 3 can view/edit Level 4 content. Level 4 cannot access Level 3, 2, or 1 content. + +Learn how to [implement team hierarchies](/user-docs/assign-roles-to-teams-at-workspace-level). + +## Frequently asked questions + +### What happens when I change a workspace-level role? + +The change only affects resources where no more specific role exists. Database and table-level overrides remain unchanged. + +### Can I restrict an Admin's access to specific tables? + +Yes. Assign Admin at workspace level, then set a lower role (or ""No access"") at the specific table level. Table-level roles override workspace roles. + +### How do I troubleshoot unexpected access? + +Check permission sources in order: table individual → table team → database individual → database team → workspace individual → workspace team. The first match determines access. + +### What's the difference between ""No Role"" and ""No access""? + +""No Role"" is an explicit assignment meaning ""no default access"" (but other sources can grant access). ""No access"" is the result when no permissions exist at all. + +### Do new databases inherit workspace roles? + +Yes. When someone creates a new database, members' workspace-level roles apply automatically unless you set database-specific overrides. + +### Can a member have different roles on different tables in the same database? + +Yes. Table-level overrides apply independently. You can assign different roles for each table regardless of database-level settings. + + +## Related content + +**Understand the system:** +- [Permissions overview](/user-docs/permissions-overview) +- [Role levels in Baserow](/user-docs/set-permission-level) + +**Implement permissions:** +- [Assign roles to members at workspace level](/user-docs/assign-roles-to-members-at-workspace-level) +- [Assign roles to teams at workspace level](/user-docs/assign-roles-to-teams-at-workspace-level) +- [Assign roles at database level](/user-docs/assign-roles-at-database-level) +- [Assign roles at table level](/user-docs/assign-roles-at-table-level) + +**Manage access:** +- [Create and manage teams](/user-docs/create-and-manage-teams) +- [Manage workspace members](/user-docs/manage-workspace-permissions) + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow.io/user-docs/assign-roles-to-teams-at-workspace-level + [2]: https://baserow.io/user-docs/assign-roles-at-database-level + [3]: https://baserow.io/user-docs/assign-roles-at-table-level",,baserow_user_docs,https://baserow.io/user-docs/role-based-access-control-rbac +102,ToolJet,tooljet,Integrate Baserow with ToolJet,"# ToolJet integration + +Build internal tools and admin panels powered by Baserow data using ToolJet's low-code platform. Connect to 30+ data sources, create custom queries, and build full applications without extensive coding. Perfect for teams building CRMs, dashboards, and data management tools. + +> To build applications within Baserow, try out [Baserow Application Builder][1]. + +## Overview + +ToolJet is an open-source low-code platform that lets you build internal applications and admin panels quickly. When connected to Baserow, you can create custom interfaces for your databases, build dashboards, and perform complex data operations through a visual interface. + +**Why use ToolJet with Baserow?** Build production-ready internal tools in hours instead of weeks. Connect Baserow data with other services like PostgreSQL, APIs, or cloud storage to create powerful business applications. Ideal for teams that need custom interfaces without hiring developers. + +## Prerequisites + +Before you begin, you'll need: +- A Baserow account (Cloud or self-hosted) +- A [ToolJet Cloud](https://www.tooljet.com/) account or [local installation](https://docs.tooljet.com/docs/setup/) +- A Baserow database API token ([how to create one](/user-docs/personal-api-tokens)) +- Your Table IDs from the databases you want to access + +## Supported operations + +ToolJet provides full CRUD (Create, Read, Update, Delete) functionality for Baserow tables: + +| Operation | Description | Common use case | +|-----------|-------------|-----------------| +| **List fields** | Retrieve all field names and types from a table | Build dynamic forms, validate data schemas | +| **List rows** | Get all rows from a table with optional filters | Display data in tables, create reports | +| **Get row** | Retrieve a specific row by ID | Show detailed record views, edit forms | +| **Create row** | Add a new row to a table | Submit forms, add new records | +| **Update row** | Modify an existing row | Edit records, update statuses | +| **Move row** | Change a row's position in the table | Reorder tasks, manage priorities | +| **Delete row** | Remove a row from a table | Archive records, clean up data | + +### Required parameters + +Each operation requires different parameters: +- **Table ID**: Found in your [Baserow API documentation](/user-docs/database-and-table-id) +- **Row ID**: The unique identifier for a specific [row][2] +- **Before ID**: (Move row only) Insert before this row ID, or leave empty to move to the end +- **Records**: (Create/Update) Field values in JSON format + +## How to connect Baserow to ToolJet + +To establish a connection with the Baserow data source, you can either click on the **+ Add new Data source** button located on the query panel or navigate to the Data Sources page through the ToolJet dashboard. + +### Step 1: Add Baserow as a data source + +1. **Open the data sources panel**: In ToolJet's app builder, click the **Data sources** tab in the left sidebar. + +2. **Select Baserow**: Search for ""Baserow"" in the data source modal. Click on Baserow to select it + +3. **Configure connection settings**: Select either the Development, Staging or Production environment. + - Enter your **Baserow API token** (create one in [Baserow settings](/user-docs/personal-api-tokens)) + - Select your Baserow type: + - **Baserow Cloud**: For hosted at baserow.io + - **Self-Host**: Enter your [instance base URL][3] (e.g., `https://api.yourcompany.com`) + - Click **Save** to store the connection + +> **Note:** ToolJet encrypts sensitive fields like API tokens before storing them in its database. + +### Step 2: Create queries to interact with Baserow + +Queries let you request and manipulate data from your Baserow tables. Each query performs one operation (list rows, create row, etc.). + +1. **Open the query editor**: Click the **+** icon in the query editor panel. Select your saved Baserow data source + +2. **Choose an operation**: Select an operation from the dropdown menu. Enter the required parameters (Table ID, Row ID, etc.) + +3. **Test the query**. Click **Run** to test the query. View the response data in the preview panel + +4. **Connect to components**: Bind query results to tables, forms, or charts. Trigger queries on button clicks or form submissions + +## Common query examples + +### List all rows from a table + +Use this to populate tables or dropdown menus: + - Operation: **List rows** + - Table ID: Your table's numeric ID + - Optional filters: Add search or sort parameters + +![List all rows from a Baserow table in ToolJet][4] + +### Create a new record from a form + +Build forms that save directly to Baserow: + - Operation: **Create row** + - Table ID: Your destination table + - Records: Map form fields to Baserow columns using `{{ components.form1.data }}` + +![Create a new Baserow record in ToolJet][5] + +### Update a record based on user input + +Let users edit existing records: + - Operation: **Update row** + - Table ID: Your table's ID + - Row ID: `{{ table1.selectedRow.id }}` + - Records: Include only the fields you want to update + +![Update a Baserow record in ToolJet][6] + +### Delete selected records + +Add delete functionality with confirmation: +- Operation: **Delete row** +- Table ID: Your table's ID +- Row ID: `{{ table1.selectedRow.id }}` + +## Use cases and examples + + - **Custom CRM system**: Build a full-featured CRM with contact management, deal tracking, and activity logs. Connect Baserow customer data to email services and calendar tools. + - **Admin dashboard**: Create internal dashboards that display key metrics from multiple Baserow tables. Add charts, filters, and real-time updates. + - **Inventory management**: Build tools to track stock levels, process orders, and manage suppliers. Connect to external APIs for shipping and payment processing. + - **Support ticket system**: Design a helpdesk interface where team members can view, assign, and resolve customer tickets stored in Baserow. + - **Project management tool**: Create custom project trackers with task boards, timelines, and resource allocation views powered by Baserow data. + +## Frequently asked questions + +### What's the difference between ToolJet and other Baserow integrations? + +ToolJet focuses on building visual applications with user interfaces. Unlike [n8n][7] or [Zapier][8] which automate workflows in the background, ToolJet creates apps that people interact with directly. Use ToolJet when you need dashboards, forms, or admin panels. Use automation platforms for scheduled tasks and data syncing. + +### Can I connect multiple Baserow databases in one ToolJet app? + +Yes. Add multiple Baserow data sources with different API tokens to access different workspaces or accounts. Each data source appears as a separate option when creating queries. + +### Do I need coding skills to use ToolJet with Baserow? + +No, but basic understanding helps. ToolJet uses a visual interface for most tasks. You may need to write simple JavaScript expressions for complex data transformations or conditional logic, but many apps can be built without any code. + +To build applications within Baserow, try out [Baserow Application Builder][1]. + +### How do I find my Table ID for ToolJet queries? + +Open your Baserow database and click the three-dot menu. Select ""API Documentation"" to see all your [Table IDs][9], field names, and data structures. Each table has a unique numeric ID like `12345`. + +### Is my Baserow data secure when using ToolJet? + +ToolJet encrypts API tokens before storing them. Data transfers use HTTPS encryption. For maximum security, use self-hosted versions of both Baserow and ToolJet within your own infrastructure. Review the security documentation for detailed information. + +## Related resources + +### Baserow documentation +- [Database API tokens](/user-docs/personal-api-tokens) - Create and manage authentication tokens +- [Database and Table IDs](/user-docs/database-and-table-id) - Find the IDs you need for queries +- [Database API documentation](/user-docs/database-api) - Complete API reference + +### Integration guides +- [n8n integration](/user-docs/n8n) - For workflow automation +- [Make integration](/user-docs/make) - Another automation platform option +- [Zapier integration](/user-docs/zapier) - Simple automated workflows + +### Tutorials +- [How to Build a Custom CRM System with Baserow and ToolJet](/blog/how-to-build-a-crm-system-with-baserow-and-tooljet) - Complete step-by-step guide with screenshots + +--- + +Still need help? If you're looking for something else, please don't hesitate to make recommendations or ask us questions; we're here to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow.io/user-docs/application-builder-overview + [2]: https://baserow.io/user-docs/overview-of-rows + [3]: https://baserow.io/user-docs/database-api + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/41dfd463-7e4c-4fae-b337-bef15ee099ed/Untitled%201.png + [5]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/816c5275-0cbf-471d-b855-ba21b2fd5504/Untitled%203.png + [6]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/2b8ba4c6-9ba1-45af-88bd-81e597468c73/Untitled%204.png + [7]: https://baserow.io/user-docs/n8n + [8]: https://baserow.io/user-docs/zapier + [9]: https://baserow.io/user-docs/database-and-table-id",,baserow_user_docs,https://baserow.io/user-docs/tooljet +103,Database and table ID,database-and-table-id,Finding your Baserow database and table IDs,"# Find Baserow database and table IDs + +Baserow database and table IDs make it easy to connect your data with external apps and automate workflows faster than manual processes. + +Database and table IDs are unique numerical identifiers in Baserow that you need for API calls, webhooks, and integrations. Find your database ID in the browser URL or API documentation, and locate table IDs through the Settings menu, API docs, or table options. + +## What are database and table IDs? + +Database and table IDs are unique numerical identifiers that Baserow assigns to every database and table you create. These IDs serve as precise references when you're working with Baserow's API, setting up webhooks, or connecting to third-party integrations like Zapier, Make, or n8n. + +Unlike names (which you can change), IDs remain constant throughout the lifetime of your database or table, making them reliable identifiers for automation and integration purposes. + +## How to find your database ID + +There are various ways to locate your Baserow database ID: + +### Method 1: Check your browser URL + +When you're viewing any table in your database, look at your browser's address bar. The URL follows this pattern: +``` +https://baserow.io/database/12345/table/678901/234567 +``` +In this example, `12345` is your database ID. + +### Method 2: Use the database API documentation + +1. Navigate to your database +2. Click on the three dots menu next to your database name +3. Select ""[View API docs][1]"" +4. Your database ID will be displayed prominently in the documentation + +## How to find your table ID + +You have various methods to find your Baserow table ID: + +### Method 1: Through database tokens + +1. Click on your workspace in the top left corner +2. Select ""Settings"" -> ""Database tokens"" +3. Click on your token +4. Select ""Show databases"" +5. Your table IDs will be listed alongside table names + +### Method 2: Check the database API documentation + +Similar to finding your database ID, the API documentation displays all table IDs within your database. + +### Method 3: Table options menu + +1. Click the three dots next to any table name +2. The table ID appears in brackets next to the table name +3. Example: ""Customer Data (12345)"" where 12345 is your table ID + +![Table ID in table options][3] + +## When you need database and table IDs + +You'll typically need these IDs when: + +- Making API calls to retrieve, create, or update data +- Setting up [webhooks][4] to trigger actions when data changes +- Configuring integrations with Zapier, Make, n8n, or other automation tools +- Building custom applications that connect to your Baserow data +- Sharing specific database or table access with developers + +## Comparison: Database ID vs Table ID + +| Aspect | Database ID | Table ID | +|--------|-------------|----------| +| **Scope** | Entire database | Individual table | +| **Use case** | Database-level operations | Table-specific operations | +| **API endpoints** | `/api/database/{id}/` | `/api/database/{db_id}/table/{table_id}/` | +| **Permissions** | Database-wide access | Table-specific access | + +## Frequently asked questions + +### What happens to IDs when I rename a database or table? +Database and table IDs never change, even when you rename them. This ensures your integrations and API calls continue working without interruption. + +### Can I use the same ID across different Baserow instances? +No, IDs are unique within each Baserow instance. If you're moving between self-hosted and cloud versions, or between different installations, the IDs will be different. + +### Do I need special permissions to view database and table IDs? +You need at least ""Viewer"" access to see database and table IDs. However, to use them in API calls, you'll need appropriate [permissions][5] for the specific operations you want to perform. + +### Are there any security considerations with sharing these IDs? +Database and table IDs themselves don't grant access to your data. However, when combined with [database tokens][5], they provide access to your information. Only share IDs with trusted parties and always use proper authentication. + +### Can I predict or generate my own database and table IDs? +No, Baserow automatically generates sequential IDs when you create databases and tables. You cannot customize or predict these numbers. + +--- + +## Related content + +- [Database tokens](/user-docs/personal-api-tokens) +- [Database API documentation](/user-docs/database-api) +- [Webhooks](/user-docs/webhooks) +- [Zapier integration](/user-docs/zapier) +- [Make integration](/user-docs/make) +- [n8n integration](/user-docs/n8n) + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](https://baserow.io/contact) for questions about Baserow or help with your account + + + [1]: https://baserow.io/user-docs/database-api + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/Screenshot_2022-07-04_at_15.28.41.png + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/2d977400-17d6-4391-a69c-96881eb6a1aa/Table%20ID%20in%20table%20options.jpg + [4]: https://baserow.io/user-docs/webhooks + [5]: https://baserow.io/user-docs/personal-api-tokens",,baserow_user_docs,https://baserow.io/user-docs/database-and-table-id +104,n8n,n8n,Integrate Baserow with n8n,"# Configure Baserow in n8n + +Connect Baserow to 400+ apps using n8n's automation platform. Create, read, update, and delete rows programmatically without writing code. Authenticate once with your Baserow credentials to build sophisticated workflows. + +## Overview + +n8n lets you connect Baserow with hundreds of other apps to create automated workflows. With the Baserow n8n node, you can sync data between systems, process forms, generate reports, and trigger actions based on database changes, all without writing custom code. + +**Why use n8n with Baserow?** Build complex automations in minutes by connecting your Baserow databases to CRMs, email tools, payment processors, and more. Perfect for teams that need to keep data synchronized across multiple platforms. + +![Baserow n8n node][1] + +## Prerequisites + +Before you begin, you'll need: +- A Baserow account (hosted at baserow.io or self-hosted) +- An n8n account or self-hosted n8n instance +- Your Baserow username and password +- Table IDs from the databases you want to automate (found in Database API documentation) + +## Supported operations + +The Baserow n8n node supports five core database operations: + +| Operation | Description | Use case | +|-----------|-------------|----------| +| **Create a row** | Add a new row to a table | Save form submissions, add CRM contacts | +| **Get a row** | Retrieve a specific row by ID | Fetch customer details, lookup records | +| **Get many rows** | Retrieve multiple rows with filters | Generate reports, sync data exports | +| **Update a row** | Modify an existing row | Update order status, edit contact info | +| **Delete a row** | Remove a row from a table | Clean up test data, archive old records | + +## Authenticate Baserow in n8n + +n8n uses credentials to securely connect to your Baserow instance. Set this up once, then reuse the connection across all your workflows. + +1. Using the `+` **Create** button in the upper-right corner from either the Overview page or a specific project. Select Credential. + +2. Search for ""Baserow"" in the credential type dropdown, and select **Baserow API**. Click **Continue** + +3. **Configure connection settings** + - **Host URL**: Use `https://api.baserow.io` for Baserow Cloud. For self-hosted: Enter your instance API URL (e.g., `https://api.yourcompany.com`) + - **Username**: Your Baserow login email + - **Password**: Your Baserow account password + +4. **Save and test**: Click **Save** to store your credentials. n8n will validate the connection automatically + +> **Tip:** Create separate credentials for production and development environments to keep workflows organized. + +## Create a row in Baserow via n8n + +This example shows how to add data to a Baserow table using n8n. + +1. **Add Baserow node to workflow**: Drag the Baserow node from the node panel. Connect it to your trigger node (webhook, schedule, etc.). + +2. **Select operation and credentials**: Choose **Create** from the Operation dropdown. Select your saved Baserow credentials. + +3. **Configure table and data**: Enter your **[Table ID][2]** (find this in [Baserow's auto-generated API documentation][3]). Add field values in the node's data section, and map data from previous nodes if needed. + +4. **Test and activate**: Click **Execute Node** to test the creation. Activate your workflow when ready + +## Common integration examples + + - CRM synchronization: Keep customer records synchronized between Baserow and Salesforce, HubSpot, or Pipedrive. Update both systems automatically when contact information changes. + - Form processing pipeline: Capture form submissions from Typeform or Google Forms, validate the data, and save it directly to your Baserow tables. Add email notifications when new records are created. + - Automated reporting: Query Baserow data on a schedule, generate formatted reports, and send them via email or Slack. Perfect for weekly sales summaries or inventory alerts. + - Webhook-triggered workflows: Use Baserow's webhooks to trigger n8n workflows when rows are created, updated, or deleted. Build real-time automations that respond to database changes. + - Mobile app backend: Build custom mobile applications that read and write data to Baserow tables through n8n workflows. Add business logic without managing servers. + +## Frequently asked questions + +### What's the difference between Baserow API and n8n integration? + +The Baserow API requires writing code to make HTTP requests. The n8n integration provides a visual interface where you drag and drop nodes to build automations. Choose n8n if you want no-code automation, and use the API directly for custom applications. + +### Can I use n8n with self-hosted Baserow? + +Yes. When setting up credentials in n8n, change the Host URL from `https://api.baserow.io` to your self-hosted Baserow instance API endpoint. Both [cloud and self-hosted versions][4] support the full range of operations. + +### How do I find my Table ID for n8n workflows? + +Open your database in Baserow and click the three-dot menu. Select ""[API Documentation][5]"" to view all your [table IDs][2], field names, and available endpoints. Each table has a unique numeric ID. + +### Do I need separate credentials for each Baserow database? + +No. One set of Baserow credentials in n8n gives you access to all databases and tables in your workspace. You specify which table to use when configuring individual workflow nodes. + +### Can n8n handle large data transfers from Baserow? + +Yes, but paginate large datasets. The ""Get many"" operation supports pagination parameters. For bulk operations, consider breaking workflows into smaller batches to avoid timeouts. + +## Related resources + +### Baserow documentation +- [Database API documentation](/user-docs/database-api) - Complete API reference for all operations +- [Webhooks](/user-docs/webhooks) - Set up event-based triggers +- [Database tokens](/user-docs/personal-api-tokens) - Alternative authentication method + +### Integration guides +- [Make integration](/user-docs/make) - Another automation platform option +- [Zapier integration](/user-docs/zapier) - Alternative for simpler workflows +- [Pipedream integration](/user-docs/pipedream) - Developer-focused automation + +### Tutorials +- [Automate Emails from a No-Code Database with n8n](/blog/automate-emails-from-database-with-n8n) - Step-by-step email automation guide +- [Update Row Data With Baserow Forms](/blog/update-row-data-with-baserow-forms) - Form processing workflow example + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/ecae2e03-ca07-46bc-8a7b-1cb54b08df15/Baserow%20in%20n8n.jpg + [2]: https://baserow.io/user-docs/database-and-table-id + [3]: https://baserow.io/api-docs + [4]: https://baserow.io/user-docs/set-up-baserow + [5]: https://baserow.io/user-docs/database-api",,baserow_user_docs,https://baserow.io/user-docs/n8n +105,Set up Baserow version,set-up-baserow,Set up your own Baserow version,"# Deploy Baserow: Choose your hosting option + +Baserow offers two deployment options: Baserow Cloud for instant setup with managed hosting, or Self-hosted for complete control over your infrastructure. Both versions offer the same core features with free and paid plans available. + +## Choosing how to deploy Baserow + +Baserow gives you flexibility in how you deploy and run the platform. Baserow Cloud provides a fully managed experience where you sign up and start building immediately, while Self-hosted deployment gives you complete control over where your data lives and how Baserow runs. Both options access the same powerful features, with pricing plans that scale as your needs grow. + +| Feature | Baserow Cloud | Self-hosted | +|---------|---------------|-------------| +| **Setup time** | Instant (sign up and go) | Requires installation and configuration | +| **Infrastructure management** | Fully managed by Baserow | You manage servers and maintenance | +| **Data location** | Baserow's cloud servers | Your chosen infrastructure | +| **Updates** | Automatic | Manual or automated (your choice) | +| **Scaling** | Automatic | You control scaling | +| **Best for** | Quick starts, teams without IT resources | Organizations with specific security/compliance needs | +| **Free tier available** | Yes | Yes (open source) | + +## Baserow Cloud: Managed hosting + +Baserow Cloud is the fastest way to start using Baserow. Sign up at [baserow.io][1], create your account, and begin building databases and applications immediately, no installation, no servers to manage, no technical setup required. + +### What Baserow manages for you + +- **Infrastructure**: Servers, storage, networking, and backups +- **Updates**: Automatic platform updates with new features +- **Security**: SSL certificates, DDoS protection, and security patches +- **Performance**: Load balancing and optimization +- **Uptime**: 99.9% availability with monitoring + +Learn more about [Baserow Cloud pricing and plans][2]. + +### When to choose Cloud + +- You want to start using Baserow immediately +- Your team lacks dedicated IT resources +- You prefer not to manage infrastructure +- You need automatic updates and maintenance +- Standard data hosting meets your compliance requirements + +[Create a free Cloud account](/signup){.button .button--large} + +## Self-hosted: Deploy on your infrastructure + +Self-hosted Baserow gives you complete control over where and how Baserow runs. Install on on-premise servers, private cloud environments, or any infrastructure you control. You manage updates, backups, security, and scaling according to your organization's requirements. + +### What you control + +- **Data location**: On-premise or cloud provider of your choice +- **Infrastructure**: Server specifications and scaling +- **Network**: Internal-only or internet-accessible deployment +- **Compliance**: Meet specific regulatory requirements +- **Customization**: Modify and extend Baserow if needed +- **Air-gapped deployment**: Run completely offline if required + +Learn more about [Baserow Self-hosted pricing and plans][2]. + +### When to choose Self-hosted + + - You need data to remain on specific infrastructure + - Compliance requires on-premise or private cloud hosting + - You want unlimited rows, storage, and API usage + - Your team has technical resources for server management + - You need air-gapped deployment without internet access + - You want to customize or extend Baserow's codebase + +[View self-hosting installation guides](/docs/index#installation){.button .button--large} + +## Open source licensing + +Baserow's codebase is primarily MIT-licensed, one of the most permissive open source licenses available. This means you can use, modify, and distribute Baserow with minimal restrictions and high compatibility with other licenses. + +## Getting started with your chosen deployment + +### Starting with Baserow Cloud + +1. [Create your free account](/signup) +2. Verify your email address +3. Create your first workspace +4. Start building databases or use templates +5. [Upgrade to a paid plan][3] when you need advanced features + +[Full quick start guide →][4] + +### Starting with Self-hosted + +1. Choose your installation method (Docker, Kubernetes, etc.) +2. Follow the [installation documentation][5] +3. Configure your instance using the [configuration guide][6] +4. Register your license for advanced features (if needed) +5. Set up user accounts and workspaces + +[Self-hosting documentation →][5] + +## Migrating between deployment options + +### Moving from Cloud to Self-hosted + +If you have already set up your self-hosted instance, migration is easy. + +1. In the Cloud version of Baserow, [export your workspace][7]. +2. Log in to your self-hosted instance, open your workspace from the top left corner, then go to **Admin tools → Settings**, and switch **Verify import signature** off. +3. [Import your workspace][8] into your new instance. + +> We can’t change your Cloud subscription into a Self-hosted subscription. You’ll need to purchase a new self-hosted license, activate it in your instance, and then cancel your Cloud plan. + +### Moving from Self-hosted to Cloud + +You can manually recreate your workspace by exporting your data from your self-hosted instance as CSV or JSON, importing the files into your Cloud workspace, and recreating your field types, views, and permission settings manually to match your previous setup. This ensures your data is preserved, though configuration and access rules will need to be rebuilt in the Cloud environment. + +Alternatively, migrating your data may require assistance from [our support team](https://baserow.io/contact-sales) to ensure data integrity and ownership verification. We verify your data ownership, then create a complete export of your workspace data. We provide import instructions. + +**Requirements:** + +- Active Baserow account with data to migrate +- Working self-hosted Baserow instance + +[Request migration assistance](/contact-sales){.button .button--large} + +## Frequently asked questions + +### Which deployment option should I choose? + +Choose **Baserow Cloud** if you want to start immediately, prefer not to manage infrastructure, and standard cloud hosting meets your needs. Choose **Self-hosted** if you need data on specific infrastructure, have compliance requirements, want unlimited usage, or have technical resources to manage servers. + +### Can I try both deployment options? + +Yes. Start with the free Cloud tier to learn Baserow quickly, then set up a self-hosted instance later if needed. You can migrate data between deployments with our assistance. + +### Who counts as a ""user"" for billing purposes? + +Understanding which users count toward your subscription helps you manage costs effectively and plan your team structure appropriately. [Learn more about billing →][10] + +### Does Self-hosted require a license for advanced features? + +The open source version is free with core features and unlimited usage. To access advanced features on Self-hosted, purchase a paid license. [View advanced features →][11] + +### Can I run Baserow completely offline? + +Yes. Self-hosted Baserow supports air-gapped deployment on servers without internet access. This is useful for secure environments or sensitive data that cannot connect to external networks. + +### What happens if I lose connection to Baserow Cloud? + +Baserow uses WebSockets for real-time collaboration. If you lose connection, you'll see a ""Connection to the server failed"" message. Baserow automatically attempts to reconnect. Simply refresh the page once your connection is restored. Check the [status page][5] if issues persist. + +## Troubleshooting and resources + +### Self-hosted installation help: +- [Installation guides for different platforms][5] +- [Configuration reference][6] +- [Debugging connection issues][13] +- [Search the community forum][14] + +### Cloud account issues: +- [Check Baserow status page][15] +- [Browse community discussions][14] +- [Contact support directly][12] + +### Common issues: + +**Connection failures**: Usually temporary network issues. Refresh the page and check your internet connection. Verify [Baserow's status][15] for any ongoing incidents. + +**Installation errors**: Review the [installation documentation][5] and [debugging guide][13]. Search the [community forum][14] for similar issues. + +**License activation**: Follow the [paid license installation guide][16] or contact support for assistance. + +## Related content + +- [Quick start: Your path to Baserow mastery][4] +- [Introduction to Baserow][17] +- [Pricing plans comparison][9] +- [Advanced features overview][3] +- [Enterprise license overview][18] +- [Baserow glossary][19] + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: / + [2]: https://baserow.io/pricing + [3]: /user-docs/subscriptions-overview + [4]: /user-docs/how-to-get-started-with-baserow + [5]: /docs/index + [6]: /docs/installation%2Fconfiguration + [7]: https://baserow.io/user-docs/export-workspaces + [8]: https://baserow.io/user-docs/import-workspaces + [9]: /pricing + [10]: /user-docs/subscriptions-overview#who-is-considered-a-user-for-billing-purposes + [11]: https://baserow.io/user-docs/pricing-plans + [12]: /contact + [13]: /docs/tutorials%2Fdebugging-connection-issues + [14]: https://community.baserow.io/search + [15]: https://status.baserow.org/ + [16]: https://baserow.io/user-docs/get-a-licence-key + [17]: /user-docs/baserow-basics + [18]: /user-docs/enterprise-license-overview + [19]: /user-docs/learn-baserow-basic-concepts",,baserow_user_docs,https://baserow.io/user-docs/set-up-baserow +106,Baserow pricing and plans,pricing-plans,Baserow pricing and paid plans,"# Baserow pricing plans + +Baserow offers four plans. Cloud versions have usage limits; self-hosted versions are unlimited. All plans include unlimited databases, but higher tiers unlock paid features. + +## Overview + +[Baserow's pricing structure][1] is designed around workspaces, with separate options for cloud-hosted and self-hosted deployments. The key difference: cloud plans have row and storage limits, while self-hosted instances offer unlimited usage across all paid tiers. + +Pricing scales per active user (non-viewers), with annual billing offering significant savings. + +For teams needing custom integrations, SSO, or audit logging, Advanced and Enterprise plans provide additional administrative controls and priority support. + +## Plan comparison + +| Feature | Free | Premium | Advanced | Enterprise | +|---------|------|---------|----------|------------| +| **Price** | $0 | $10-12/user/month | $18-22/user/month | Custom pricing | +| **Cloud rows** | 3,000 | 50,000 | 250,000 | Contact sales | +| **Cloud storage** | 2GB | 20GB | 100GB | Contact sales | +| **Self-hosted limits** | Unlimited | Unlimited | Unlimited | Unlimited | + +## Free plan + +The Free plan is ideal for small projects and personal use. Available on both cloud and self-hosted versions, it includes unlimited databases but restricts cloud usage to 3,000 rows and 2GB storage per workspace. + +### Free plan limitations + +- **Export formats:** Only CSV export available (no JSON/XML) +- **Collaboration:** No row comments or advanced sharing +- **Views:** Grid, Gallery, and Form views only +- **Branding:** Baserow logo remains visible +- **Permissions:** Basic workspace sharing only + +> If you exceed row limits for 7 consecutive days, new row creation will be blocked until you upgrade or reduce usage. + +## Premium plan + +The Premium plan unlocks professional features for growing teams and projects requiring advanced data visualization and collaboration. + +**Enhanced limits:** +- Cloud: 50,000 rows, 20GB storage per workspace + - [JSON, Excel and XML export][3] for comprehensive data portability + - [Kanban view][4] for agile project management workflows + - [Calendar view][5] for time-based data visualization and planning + - [Survey form mode][6] for enhanced data collection experiences + - [Timeline view][7] + - [Personal views][8] + - [Graph widget][9] + - [Row comments][10] for collaborative feedback and discussion + - [Row coloring][11] for visual data organization and categorization + - [Baserow branding removal][12] from forms for professional branding + - [AI field][13] + - [AI formula generator][14] + +Role-based permissions and administrative features remain unavailable. These require Advanced or Enterprise plans. + +## Advanced plan + +The Advanced plan provides enterprise-grade security and management features for larger organizations requiring granular access control. + +**Everything from Premium, plus:** + +- Enhanced limits: 250,000 rows, 100GB storage (cloud) + - [Role-based permissions][15] for granular access control + - [Field-level permissions][16] + - Direct priority support for faster issue resolution + - [Audit logging][17] for compliance and security monitoring + - [Applications][18] - File upload element, SSO user authentication + - White label application branding + - [Data sync][19] - Baserow table, Jira issues, GitLab issues, HubSpot customers, GitHub issues + - [Single Sign-On][20] integration for streamlined authentication + +The primary differentiator between Advanced and Premium is role-based permissions, allowing granular control over who can view, edit, or manage databases and workspaces within your organization. + +## Enterprise plan - Custom pricing + +Enterprise plans offer maximum flexibility and control for large organizations with specific requirements. + +**Available exclusively for self-hosted deployments** with custom pricing based on your organization's needs. + +Enterprise includes everything from Advanced plus + - Managed Baserow instance + - Implementation services + - Payment by invoice + - Tool co-branding + +[Contact sales](https://baserow.io/contact-sales) for Enterprise pricing and feature discussions. + +## Frequently asked questions + +### What counts as a ""user"" for billing? + +Baserow charges per active user (non-viewer). [Learn more about user types](/user-docs/subscriptions-overview#who-is-considered-a-user-for-billing-purposes). + +### Can I mix free and paid users? + +Yes, in Premium and Advanced self-hosted instances, you can mix Free users with paid licenses as license is instance-based. Cloud subscription is per workspace and requires all active contributors to be on the same plan tier, so they cannot be mixed with Free users. + +### What happens when I exceed row limits? + +Cloud users exceeding row limits for 7+ days cannot create new rows until upgrading or reducing usage. You'll receive clear error messages explaining your options. + +### How does annual vs monthly billing work? + +Annual billing provides 17-22% savings across all plans: +- Premium: $10/year vs $12/month per user +- Advanced: $18/year vs $22/month per user + +### Can I change plans anytime? + +Yes, you can upgrade or downgrade plans at any time. [Learn how to change subscriptions](/user-docs/buying-a-subscription). + +### Is there a rate limit? + +Self-hosted instances have no rate limits. Cloud versions limit to 10 concurrent requests for optimal performance across shared infrastructure. + +## Getting started + +Ready to choose your Baserow plan? + +1. **Start with Free** for personal projects or small teams +2. **Choose Premium** for professional features and team collaboration +3. **Select Advanced** for role-based security and larger datasets +4. **Consider Enterprise** for custom requirements and dedicated support + +Visit the [Baserow pricing page](https://baserow.io/pricing) for current rates and to start your upgrade. + +## Related content + +- [How to buy a subscription](/user-docs/buying-a-subscription) +- [Subscription overview and billing](/user-docs/subscriptions-overview) +- [Role-based permissions guide](/user-docs/permissions-overview) +- [Enterprise license overview](/user-docs/enterprise-license-overview) +- [Self-hosted installation guide](/user-docs/set-up-baserow) + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](https://baserow.io/contact) for questions about Baserow or help with your account. + + + [1]: https://baserow.io/pricing + [3]: https://baserow.io/user-docs/export-tables + [4]: https://baserow.io/user-docs/guide-to-kanban-view + [5]: https://baserow.io/user-docs/guide-to-calendar-view + [6]: https://baserow.io/user-docs/form-survey-mode + [7]: https://baserow.io/user-docs/guide-to-timeline-view + [8]: https://baserow.io/user-docs/personal-views + [9]: https://baserow.io/user-docs/dashboards-overview + [10]: https://baserow.io/user-docs/row-commenting + [11]: https://baserow.io/user-docs/row-coloring + [12]: https://baserow.io/user-docs/guide-to-creating-forms-in-baserow + [13]: https://baserow.io/user-docs/ai-field + [14]: https://baserow.io/user-docs/generate-formulas-with-baserow-ai + [15]: https://baserow.io/user-docs/permissions-overview + [16]: https://baserow.io/user-docs/field-level-permissions + [17]: https://baserow.io/user-docs/admin-panel-audit-logs + [18]: https://baserow.io/user-docs/elements-overview + [19]: https://baserow.io/user-docs/data-sync-in-baserow + [20]: https://baserow.io/user-docs/single-sign-on-sso-overview + [21]: https://baserow.io/user-docs/enterprise-admin-panel",,baserow_user_docs,https://baserow.io/user-docs/pricing-plans +107,Delete account,delete-your-baserow-account,Delete your user account in Baserow,"# Delete your Baserow account + +Deleting your account is permanent and removes all personal data from Baserow. Consider exporting important data before deletion. + +This guide covers how to permanently delete your Baserow account, what happens to your workspaces and data, and how the 30-day grace period works. + +## How to delete your account + +Account deletion happens in two stages: scheduling deletion, then permanent deletion after a grace period. + +### Schedule account deletion + +1. Log in to your Baserow account +2. Click your **workspace icon** in the top-right corner +3. Select **My settings** from the dropdown +4. Scroll to the bottom of the sidebar +5. Click **Delete account** +6. Review the **warning popup** showing: + - Workspaces that will be deleted (where you're sole admin) + - Workspaces you'll be removed from (other admins exist) +7. Click **Delete account** to confirm + +![Account deletion interface](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/52bd0673-997c-4040-ac22-d224f85d2611/Account%20settings.jpg) + +> **Active subscription requirement:** If you have an active paid subscription, you must [cancel it](/user-docs/change-a-paid-subscription#cancel-a-subscription) before scheduling account deletion. The system won't allow deletion with active billing. + +### Grace period (30 days default) + +After scheduling deletion, your account enters a **30-day grace period** before permanent deletion. + +**During the grace period:** +- Your account remains accessible (can log in) +- Your data remains intact and accessible +- API tokens still work (can access via API) +- You can cancel deletion by simply logging in +- Workspaces function normally + +**After the grace period:** +- Account is permanently deleted automatically +- All sole-admin workspaces are deleted permanently +- Data cannot be recovered by you or Baserow support +- You're removed from all shared workspaces + +> **Enterprise admins:** Self-hosted instances can adjust the grace period in the Admin Panel Settings. The default is 30 days, but enterprise admins can configure shorter or longer periods based on organizational policies. + +### Cancel scheduled deletion + +If you change your mind during the grace period, simply log in to Baserow. Logging in automatically cancels the scheduled deletion and reactivates your account fully. No additional steps required. + +## API access during grace period + +**Important security note:** Database tokens remain active during the 30-day grace period. If you need to revoke API access immediately: + +1. Before scheduling deletion, go to **Settings** > **Database tokens** +2. Delete all your API tokens +3. Then schedule account deletion + +This prevents API access to your workspaces during the grace period, even though your account technically still exists. + +## Workspace impact + +The deletion confirmation pop-up shows exactly which workspaces will be deleted because you are the only admin. + +### Workspaces where you're the sole admin + +**These workspaces will be permanently deleted** when your account is deleted: All databases, tables, and data are gone permanently. All workspace members lose access. No recovery possible after the grace period. + +**To prevent deletion:** [Transfer admin access](/user-docs/working-with-collaborators) to another workspace member before scheduling account deletion. This ensures workspace continuity. + +### Workspaces with other admins + +**You'll be removed from these workspaces:** Workspaces continue operating normally. Other members retain full access. Your contributions remain (comments, data changes). + +Shared workspaces are not affected by your account deletion as long as other admins exist. + + +## Before you delete your account + +**Account deletion is permanent and cannot be undone after the grace period.** Review these points before proceeding: + + - **✓ Export important data:** Download any databases, tables, or workspaces you want to keep using [workspace export](/user-docs/export-workspaces) or [table export](/user-docs/export-tables). + - **✓ Transfer workspace ownership:** If you're the sole admin of workspaces others use, [transfer admin access](/user-docs/working-with-collaborators) to another user first. + - **✓ Cancel active subscriptions:** [Cancel any paid subscriptions](/user-docs/change-a-paid-subscription#cancel-a-subscription) before scheduling account deletion. + - **✓ Delete API tokens:** Remove [database tokens](/user-docs/personal-api-tokens) to immediately revoke API access. Tokens remain active during the grace period. + - **✓ Remove sensitive data:** [Delete any sensitive databases, tables, or files][1] you don't want remaining during the grace period. + - **✓ Notify team members:** Alert workspace collaborators that you're leaving and arrange workspace transitions. + +## What gets deleted + +When your account is permanently deleted: + +**Your account data:** Your user profile and login credentials, personal account settings and preferences, all database tokens (API access), email notification preferences, and account activity history + +**Workspaces where you're the sole admin:** The entire workspace is permanently deleted, all databases within those workspaces, all tables, fields, rows, and data, all files and attachments, view configurations and filters, and Permissions and team settings. + +**What remains (if other admins exist):** Workspaces with other admins continue operating, comments and changes you made remain attributed to you, and shared workspaces lose you as a member only + + +## Frequently asked questions + +### Can I recover my account after permanent deletion? + +No. After the grace period expires, account deletion is permanent and irreversible. Baserow cannot recover deleted accounts or data. The only recovery option is to log in during the grace period, which cancels the deletion. + +### What if I delete my account accidentally? + +You have 30 days (grace period) to cancel by simply logging in. After that, deletion is permanent. If you realize the mistake immediately, log in right away to cancel the deletion. + +### Can I delete my account if I'm the only admin of shared workspaces? + +Yes, but those workspaces will be permanently deleted along with your account. If others need continued access, you must [transfer admin access](/user-docs/working-with-collaborators) to another workspace member before deleting your account. + +### What happens to comments I made in workspaces I don't own? + +Your comments and activity history remain in shared workspaces. The content of your comments stays intact for record-keeping. + +### How do I delete specific data without deleting my entire account? + +Use [delete and recovery features](/user-docs/data-recovery-and-deletion) to remove specific workspaces, databases, tables, or rows. You don't need to delete your entire account to remove data. Account deletion is only for permanently leaving Baserow. + +### Can workspace admins prevent me from deleting my account? + +No. Account deletion is a personal decision that workspace admins cannot block. However, if you're the sole admin of shared workspaces, you should coordinate with team members and transfer admin access before deleting to avoid disrupting their work. + +### Will I be charged after scheduling deletion? + +Not if you cancel your subscription first (which is required before scheduling deletion). No billing occurs during or after the grace period. Cancel your subscription, then schedule account deletion. + +## After account deletion + +Once the grace period expires and your account is permanently deleted: + +**You can create a new account** with the same email address if you want to return to Baserow later. This will be a completely new account with no connection to your deleted account. + +**Former workspaces cannot be recovered.** Deleted workspaces (where you were the sole admin) are permanently gone. No recovery is possible even if you create a new account. + +**Shared workspace access lost.** You lose access to all shared workspaces. To regain access, another admin must invite your new account. + +**Start fresh.** New accounts start with empty workspaces. You'll need to recreate or re-import any data you want from your previous account. + +## Related resources + +### Before deleting +- [Export workspaces](/user-docs/export-workspaces) - Download complete workspace backups +- [Export tables](/user-docs/export-tables) - Download individual table data +- [Transfer workspace ownership](/user-docs/working-with-collaborators) - Assign new admins +- [Cancel subscriptions](/user-docs/change-a-paid-subscription#cancel-a-subscription) - End billing + +### Account management +- [Account settings overview](/user-docs/account-settings-overview) - Manage your account +- [Password management](/user-docs/password-management) - Account security +- [Delete and recover data](/user-docs/data-recovery-and-deletion) - Remove specific data + +### Workspace management +- [Manage workspace members](/user-docs/manage-workspace-permissions) - Add and remove members +- [Permissions overview](/user-docs/permissions-overview) - Role-based access control +- [Delete a workspace](/user-docs/delete-a-workspace) - Remove workspaces without deleting account + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow.io/user-docs/data-recovery-and-deletion",,baserow_user_docs,https://baserow.io/user-docs/delete-your-baserow-account +108,Email and password authentication,email-and-password-authentication,Baserow email login setup and management,"# Manage email and password authentication in Baserow + +Baserow supports SSO for a [range of identity providers (IdP)][1]. SSO feature is a part of the Baserow Enterprise offering. + +This article is intended for administrators who want to enable/disable email and password authentication. + +## Disable password provider + +Email and password authentication can be enabled or disabled from the Authentication page of the Admin Panel like other IdPs. + +Before enabling/disabling email and password authentication via the admin panel, you must first enable an SSO identity provider. Learn more about [configuring SSO in the Admin Panel][2]. + +> At least one auth provider has to be always enabled. If authentication with email/password is disabled, SAML or OAuth 2 provider needs to be configured. It is not possible to delete or disable the last enabled provider. +> + +To disable Email and password authentication, + +1. Navigate to the Admin Panel. +2. Click on the Authentication page in the navigation sidebar on the left. You should see a list of IdPs configured. +3. Toggle the switch under ""Email and password authentication” to enable or disable. + +![enter image description here][3] + +Note that when password authentication is disabled, the login and sign up forms are hidden. If disabled, only an instance admin is allowed to log in with their email and password. + +## Bypass login page redirect + +> Note that this action is restricted to instance admins. An Instance Admin is the account that installs and sets up Baserow and has staff privileges. +> + +Both SAML and OAuth2 providers work based on redirection to another site. If password authentication is disabled and only one redirect-based auth provider is enabled (SAML or OAuth 2), the login page will redirect users automatically. By default, the user will see the login page only for a brief moment before it redirects. + +However, the instance admin (super admin) can always log in via email and password even when the Email and password authentication is disabled and the automatic redirect is in action. + +If the login form is hidden, the instance admin can bypass this automatic redirect behavior on the login page by adding the `?noredirect` parameter to the login URL. + +The instance admin can use this `?noredirect` URL parameter to actually display the login page and log in via email and password. + +The full URL in the SaaS hosted version would look like: `https://baserow.io/login?noredirect` + +This is helpful so that instance admins know how to log in to Baserow if their SAML or OAuth provider is misconfigured and email/password auth is disabled. If the password authentication is enabled, the login page will never redirect and all users can log in with their details. + +## Related content + + - [Single Sign On (SSO) overview][4]. + - [Enable SSO in the admin panel][5]. + - [Baserow Enterprise plan][6]. + +--- + + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we’re ready to assist you. + +   [Ask the Baserow community](https://community.baserow.io) + +   [Contact support](/contact) for questions about Baserow or help with your account. + + + [1]: /user-docs/single-sign-on-sso-overview + [2]: /user-docs/enable-single-sign-on-sso + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/d0847ce8-ca7c-482b-a72f-0f99291e4202/Screenshot%202023-01-06%20at%2012.30.10.png + [4]: /user-docs/single-sign-on-sso-overview + [5]: /user-docs/enable-single-sign-on-sso + [6]: /user-docs/enterprise-license-overview",,baserow_user_docs,https://baserow.io/user-docs/email-and-password-authentication +109,Add database from template,add-database-from-template,Add Baserow database from a template,"# Add a database from a template + +Baserow templates combine best-practice database design with flexibility; start quickly, then adapt to your unique workflow. + +Start building databases instantly with Baserow's 50+ pre-built templates. Choose from categories like project management, CRM, inventory tracking, and more; then customize to fit your exact needs. + +Whether you're managing a blog, tracking sales, or organizing events, templates give you a professional starting point that you can customize in minutes. + +[Explore Baserow templates](https://baserow.io/templates){.button .button--large} + +## Overview + +Templates provide the fastest way to create functional databases in Baserow. Instead of building structure from scratch, templates offer pre-configured tables, fields, views, and sample data designed for specific use cases. + +Using templates offers a fast and efficient way to get started. They save time by providing pre-built tables, sample data, and ready-to-use structures. Templates also demonstrate best practices, showing effective table structures, field types, relationships, and view options. Everything is fully customizable, allowing you to adjust tables, fields, and data to match your needs while keeping professional conventions and optimized configurations in place. + +![Image Install Baserow template][1] + +## How to add a template: Two methods + +### Method 1: From the template gallery + +This is best when you want to explore all available templates and preview them before installing. + +1. Visit the [Baserow template gallery](https://baserow.io/templates/) +2. Browse templates by category or search for specific use cases +3. Click on a template to view details and preview structure +4. Click **Use this template** button +5. Select your workspace from the dropdown (or create a new workspace) +6. Click **Create** to install the template + + +### Method 2: From your workspace dashboard + +This is best when you already know which template you want and just need to install it quickly. + +1. Navigate to your workspace home page +2. Click **+ Add new** button at the top +3. Select **From template** from the dropdown menu +4. Browse the template selector that appears +5. Click on your chosen template to preview +6. Click **Use this template** to install + +The dashboard method shows the same templates as the gallery; choose based on whether you want to browse in a dedicated view or stay within your workspace. + + +## After installing a template + +Once the installation is complete, your new database opens with all tables fully configured, sample data illustrating how it works, multiple pre-configured views (Grid, Kanban, Gallery, etc.), fields set with appropriate types and settings, and relationships between tables already established. + +### Immediate next steps + +Start by exploring the database structure: click through each table to understand its purpose, review field types (hover over field names for details), examine the different views, and study the sample data to see the intended use case. + +Next, customize the database to fit your workflow by renaming tables and fields, adding new fields, removing unnecessary ones, and adjusting field properties such as options and validations. + +After customizing, replace the sample data by deleting or archiving rows, [importing your existing data](/user-docs/import-data-into-an-existing-table) via CSV, manually entering new rows, or setting up [forms](/user-docs/guide-to-creating-forms-in-baserow) for data collection. + +Finally, configure permissions by [adding collaborators](/user-docs/working-with-collaborators) to your workspace, assign [role-based permissions](/user-docs/permissions-overview) for team members, and create [personal views](/user-docs/personal-views) for individual users. + + + +### Customize the template + +Templates provide a starting point, but you can tailor them to fit your workflow. + +You can add new tables by clicking ""+ Add table"" in your database, naming the table, and creating [Link to table](/user-docs/link-to-table-field) fields to connect it with existing tables. Field types can be modified to better match your data by editing the field type and adjusting properties as needed. + +Additional views can be created beyond the defaults provided by the template (Grid, Gallery, [Kanban](/user-docs/guide-to-kanban-view), [Calendar](/user-docs/guide-to-calendar-view), or [Timeline](/user-docs/guide-to-timeline-view)), configure filters, sorts, and groupings, and save the view as [personal or collaborative](/user-docs/collaborative-views). + +Formula fields included in templates can also be adjusted by editing the field, updating the formula with the [formula reference](/user-docs/understanding-formulas), and testing with sample data before applying. + +## Template vs. scratch vs. import + +| Scenario | Best approach | +|----------|---------------| +| New to Baserow, common use case | **Start with template** | +| Unique requirements, specific workflow | **[Create a database from scratch](/user-docs/create-a-database)** | +| Migrating from Airtable | **[Import Airtable to Baserow](/user-docs/import-airtable-to-baserow)** | +| Learning database design | **Use template as example** | +| Time-sensitive project | **Template + quick customization** | +| Complex relational structure | **Build from scratch** or heavily modify template | + +Alternatively, [duplicate a database](/user-docs/create-a-database) to replicate proven structures. + +## Frequently asked questions + +### Can I modify a template after installing it? + +Yes, templates are fully customizable. Every table, field, view, and setting can be modified after installation. Templates provide structure, but you have complete freedom to adapt them. Think of templates as intelligent starting points, not rigid restrictions. + +### What happens to the sample data in templates? + +Sample data is included to demonstrate how the template works. You can keep it for reference, delete it row by row, or bulk delete all sample rows at once. Alternatively, use filters to hide sample data while keeping it for reference. + +### Can I use the same template multiple times? + +Absolutely. Install a template as many times as needed; for different projects, departments, or clients. Each installation creates an independent database that you can customize separately. + +### How do I find templates for my specific industry? + +Browse templates by category in the [template gallery](https://baserow.io/templates/), or use the search function with keywords related to your industry. If you don't find an exact match, choose a similar template and customize it. Many templates apply across industries with minor adjustments. + +### Can I share my customized template with others? + +Currently, there's no built-in template sharing feature, but you can: +- [Export your database](/user-docs/export-workspaces) and share the export file +- [Duplicate the database](/user-docs/create-a-database) for colleagues in the same workspace +- Submit well-designed templates to Baserow for inclusion in the official gallery + +### Do templates work on all Baserow plans? + +Yes, all templates are available on every Baserow plan, including the free tier. Some templates may use features specific to paid plans, but core template functionality works universally. + +## Related content + +Now that you've installed a template, explore these topics: + +### Customize your database +- **[Introduction to fields](/user-docs/baserow-field-overview)** – Learn about 25+ field types for customization +- **[Create a field](/user-docs/adding-a-field)** – Add new fields to template tables +- **[Field configuration options](/user-docs/field-customization)** – Adjust field properties and validation + +### Work with your data +- **[Import data into tables](/user-docs/import-data-into-an-existing-table)** – Replace sample data with your own +- **[Create a row](/user-docs/how-to-make-new-rows)** – Add records to your database +- **[Create custom views](/user-docs/create-custom-views-of-your-data)** – Build additional perspectives + +### Advanced features +- **[Link to table field](/user-docs/link-to-table-field)** – Understand table relationships in templates +- **[Introduction to formulas](/user-docs/formula-field-overview)** – Modify formula fields in templates +- **[Create forms](/user-docs/guide-to-creating-forms-in-baserow)** – Collect data from others + +### Share and collaborate +- **[Add workspace collaborators](/user-docs/working-with-collaborators)** – Invite team members +- **[Role-based permissions](/user-docs/permissions-overview)** – Control who can edit template databases +- **[Share a view publicly](/user-docs/public-sharing)** – Create public links to template data + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we're ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account. + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/339622a7-b07f-4ab5-a918-0e0dacc138a6/AB%20templates.png",,baserow_user_docs,https://baserow.io/user-docs/add-database-from-template +110,Import Airtable base to Baserow,import-airtable-to-baserow,Import your Airtable base into Baserow,"# Import from Airtable to Baserow + +Baserow makes Airtable migration seamless; import your entire base structure and data with one click, then enjoy open-source flexibility. + +Migrate your Airtable bases to Baserow in minutes with automatic field type conversion and data preservation. Learn what transfers, what needs reconfiguration, and how to prepare for a smooth migration. + +## Overview + +Switching from Airtable to Baserow doesn't mean starting from scratch. Baserow's import feature automatically converts your Airtable bases into Baserow databases, preserving your tables, data, views, and most field configurations. + +The process takes just minutes and handles field type conversions automatically, so you can focus on customizing your new database rather than rebuilding it. + + + + + +## Before you import: Prerequisites + +You'll need a public share link to your entire Airtable base. If you can't find the share option, check your Airtable permissions. See [Airtable's documentation](https://support.airtable.com/docs/creating-airtable-base-share-links) for detailed help. + +Ensure you have a [Baserow workspace](/user-docs/setting-up-a-workspace) ready, and verify you have permissions in the workspace. Check storage availability if importing large bases with many attachments + + +## How to import from Airtable + +1. Navigate to your Baserow workspace home page +2. Click **+ Add new** at the top of the workspace +3. Select **Database** from the dropdown menu +4. Switch to the ""Import from Airtable"" tab in the creation dialog +5. Paste your Airtable share link into the input field +6. Click **Import from Airtable** to start the process + +You'll see a progress indicator during import. An Airtable base with many files can slow down the import. Enabling ""Skip importing files"" skips the import of the files. + +This will import most of the data, but there are incompatibilities. A table named ""Airtable import report"" will therefore be added, containing a list of things that were not or partially imported. + +Once complete, your new database opens automatically with all imported data ready to use. + +![Import Airtable base to Baserow](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/341f6ab4-3927-45d6-a687-50106ec3f434/Airtable%20import.png) + +### Session authentication + +If the import responds with ""The Airtable base requires authentication."" then it could be that the organizational settings in Airtable prevent accessing the Airtable base without authenticating first. To do this, the session and signature must be manually extracted. + + 1. Visit the URL of the publicly shared base in your browser and sign in, if needed. + 2. Click on the application menu by clicking in the top right corner -> **More tools** -> **Developer tools**. + 3. Open the **Application** (in Firefox ""Storage"") tab and click on `https://airtable.com`. + 4. Then, find the `__Host-airtable-session` and `__Host-airtable-session.sig` cookie values, and paste them in the inputs. + +## What gets imported + +### Automatically transferred + +✅ **All tables** – Complete table structure with all records +✅ **Field types** – Converted to Baserow equivalents +✅ **Table relationships** – Link to another record becomes Link to table +✅ **Attachments and files** – All uploaded files preserved +✅ **Views** – Grid views with filters, sorts, and grouping +✅ **Field properties** – Formatting, options, and configurations +✅ **Row data** – All records with their complete information + +### Requires reconfiguration + +❌ **Automations** – Rebuild using [Baserow automations](/user-docs/workflow-automation) +❌ **Custom interfaces** – Recreate with [Application Builder](/user-docs/application-builder-overview) +❌ **Integrations** – Reconnect using [Baserow API](/user-docs/database-api) +❌ **Row comments** – Not imported; start fresh in Baserow +❌ **Revision history** – Historical changes not preserved +❌ **Field descriptions** – Add manually after import +❌ **Access controls** – Reconfigure [permissions](/user-docs/permissions-overview) + +## Field type conversions + +Baserow automatically converts Airtable field types to their closest equivalents. Most conversions are direct matches, but some require understanding the differences: + +### Direct conversions (no changes needed) + +| Airtable field | Baserow field | Notes | +|----------------|---------------|-------| +| Single line text | Single line text | Perfect match | +| Long text | Long text | Perfect match | +| Single select | Single select | Colors may differ slightly | +| Multiple select | Multiple select | Colors may differ slightly | +| Checkbox | Boolean | Same functionality | +| URL | URL | Perfect match | +| Date | Date | Converts to ISO format | +| Phone number | Phone number | Perfect match | +| Email | Email | Perfect match | +| Rating | Rating | Perfect match | +| Attachment | File | All files preserved | +| Link to another record | Link to table | Relationships maintained | +| Created time | Created on | Timestamps preserved | +| Last modified time | Last modified | Timestamps preserved | + +### Numeric conversions (formatting preserved) + +Number fields retain formatting like decimal places and thousand separators, but large number abbreviations (1K, 1M) won't be preserved. + +| Airtable field | Baserow field | How it converts | +|----------------|---------------|-----------------| +| Number | Number | Decimal places and separators preserved | +| Currency | Number | Symbol becomes prefix (e.g., ""$"" before values) | +| Percent | Number | ""%"" becomes suffix (e.g., ""75%"") | +| Duration | Number | Converts to numeric seconds/minutes | + +### Fields not imported (manual recreation required) + +These Airtable field types don't have direct Baserow equivalents and will not be imported. Before importing, you can change these fields to text or number fields in Airtable to preserve the data, then recreate the functionality in Baserow after import: + + - **Formula** – Recreate using [Baserow formula fields](/user-docs/formula-field-overview) + - **Lookup** – Recreate using [Baserow lookup fields](/user-docs/lookup-field) + - **Rollup** – Recreate using [Baserow rollup fields](/user-docs/rollup-field) + - **Collaborator/Assignee** – Use [Baserow collaborator fields](/user-docs/collaborator-field) + - **Created by** – Use [Baserow created by fields](/user-docs/created-by-field) + - **Last modified by** – Use [Baserow last modified by fields](/user-docs/last-modified-by-field) + - **Button** – Functionality depends on button action + - **Barcode** – Store as a text or number field + +## After importing: Next steps + +### Verify your data +Check each table to confirm all rows imported and compare record counts between Airtable and Baserow. Spot-check records for accuracy and test linked records. Review Baserow's import report to identify items requiring manual recreation. + +### Recreate advanced features +Rebuild formula fields using [Baserow formulas](/user-docs/formula-field-overview) or [Baserow AI](/user-docs/generate-formulas-with-baserow-ai). Document Airtable automations and recreate them with [webhooks](/user-docs/webhooks) or workflow tools like [Zapier](/user-docs/zapier), [Make](/user-docs/make), and [n8n](/user-docs/n8n). Recreate custom interfaces via [Application Builder](/user-docs/application-builder-overview), forms with [Baserow forms](/user-docs/guide-to-creating-forms-in-baserow), and public views for sharing. + +### Optimize for Baserow +Set up [Kanban](/user-docs/guide-to-kanban-view), [Calendar](/user-docs/guide-to-calendar-view), or [Timeline](/user-docs/guide-to-timeline-view) views, along with [personal views](/user-docs/personal-views), filters, and sorts. Add workspace members, configure [role-based permissions](/user-docs/permissions-overview), and create [teams](/user-docs/create-and-manage-teams) for collaboration. + +## Alternatives to importing + +If the import function does not fit your needs, there are several alternative approaches. One option is to start fresh using templates. You can browse [Baserow templates](/user-docs/add-database-from-template) tailored to similar use cases, customize them instead of importing from Airtable, and take advantage of designs optimized for Baserow. + +Another approach is manual recreation. This involves [creating a database from scratch](/user-docs/create-a-database) while optionally importing only the data via CSV. This method allows you to rebuild the structure while redesigning and optimizing your workflow. + +A hybrid approach combines both strategies. You can import an existing base for structure and data, then use a template to add new features, giving you the flexibility to leverage the strengths of both methods. + +## Frequently asked questions + +### How long does the import process take? + +Import time depends on your base size. Small bases (under 1,000 rows) complete in seconds, medium bases (1,000-10,000 rows) take 1-2 minutes, and large bases (10,000+ rows) may take several minutes. File attachments add to import time since they're downloaded and re-uploaded to Baserow. + +### Will my Airtable base be affected during import? + +No. The import process only reads your Airtable data using the public share link. Your original Airtable base remains completely unchanged. You can continue using Airtable during and after the import process. + +### Can I import multiple Airtable bases at once? + +No, you must import bases one at a time. Each Airtable base becomes a separate Baserow database. If you have multiple related bases in Airtable, import them individually, then consider using [Link to table](/user-docs/link-to-table-field) fields to connect them in Baserow. + +### What happens if my import fails? + +If import fails, you'll see an error message explaining the issue. Common causes include invalid share links, Airtable permission issues, or network problems. Try generating a new share link and importing again. If problems persist, [contact support](/contact) with your error message and base details. + +### Can I import the same base multiple times? + +Yes, you can import an Airtable base as many times as needed. Each import creates a new, independent Baserow database. This is useful for testing migrations or creating separate databases for different purposes (production vs. testing, different time periods, etc.). + + +## Troubleshooting common issues + +### ""Invalid share link"" error +This is caused by the share link isn't properly formatted or has expired. Generate a new share link in Airtable and ensure you're copying the entire URL + +### Missing tables after import +This is caused by the share link might be for a view, not the entire base. Make sure you're sharing the whole base, not just a single view or table + +### Formulas showing as empty fields +This is caused by formula fields aren't imported automatically. This is expected behavior. Recreate formulas using [Baserow formula syntax](/user-docs/understanding-formulas) + +### File attachments missing +This is caused by large files that may time out during transfer. Import smaller batches or check your network connection. Very large files (over 100MB) may need manual upload + +### Colors don't match exactly +This is because Baserow uses a slightly different color palette. This is cosmetic and doesn't affect functionality. You can manually adjust colors in single/multiple select fields after import + + +--- + +## Related content + +Now that you've imported from Airtable, explore these resources: + +### Learn Baserow features +- **[Introduction to databases](/user-docs/intro-to-databases)** – Understand Baserow's database model +- **[Introduction to fields](/user-docs/baserow-field-overview)** – Explore all 25+ field types +- **[Formula field reference](/user-docs/understanding-formulas)** – Recreate your Airtable formulas + +### Rebuild advanced functionality +- **[Webhooks](/user-docs/webhooks)** – Replace Airtable automations +- **[Application Builder](/user-docs/application-builder-overview)** – Recreate custom interfaces +- **[Database API](/user-docs/database-api)** – Reconnect integrations + +### Set up collaboration +- **[Add workspace collaborators](/user-docs/working-with-collaborators)** – Invite your team +- **[Role-based permissions](/user-docs/permissions-overview)** – Control access levels +- **[Share views publicly](/user-docs/public-sharing)** – Create public links + +### Additional resources +- **[How to migrate from Airtable to Baserow](/blog/how-to-migrate-from-airtable-to-baserow)** – Comprehensive migration guide +- **[Delete a database](/user-docs/delete-a-database)** – Clean up test imports + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account.",,baserow_user_docs,https://baserow.io/user-docs/import-airtable-to-baserow +111,Import data into a table,import-data-into-an-existing-table,Import data into an existing Baserow table,"# Import data into an existing table + +Import into existing tables when you need to add or update data while preserving your carefully configured field structure and types. + +Add rows to existing tables by importing CSV, JSON, or XML files, or paste directly from spreadsheets. Choose between appending new records or updating existing ones based on matching criteria. + +> This guide covers adding data to existing tables. To create new tables from files, see [Create a table via import](/user-docs/create-a-table-via-import). + +## Overview + +Importing into existing tables adds data to tables you've already configured with specific field types. Unlike [creating tables via import](/user-docs/create-a-table-via-import) (where all fields start as text), importing into existing tables respects your field configurations; dates stay dates, numbers stay numbers, and select fields match options automatically. This is perfect for regularly updating tables with new data or refreshing existing records. + +![JPEG Image Merge or upsert rows during additional import][1] + + +## When to use existing table imports + +**Use existing table imports when:** +- Adding new records to a table you update regularly (weekly sales data, new customer entries, etc.) +- Updating existing records with fresh information from external systems +- Importing data that needs to match pre-configured field types (dates, select options, linked records) +- Maintaining consistent field structure while adding variable data + +**Use [new table imports](/user-docs/create-a-table-via-import) when:** +- Starting a brand-new project without existing structure +- Importing one-time datasets that don't need regular updates +- Experimenting with data structure before committing to field types +- Creating independent tables from different data sources + + +## Supported file formats + +You can import data from multiple sources into existing tables: + + - **File uploads:** CSV files from spreadsheet exports, JSON files from API exports or database dumps, and XML files from technical systems all work seamlessly. Each format automatically maps to your table's existing field structure. + - **Direct paste:** Copy cells directly from Excel, Google Sheets, or any spreadsheet application and paste into Baserow. This is great for small datasets or quick updates. + +Baserow intelligently maps imported columns to your existing fields by matching column headers to field names. If headers don't match exactly, you can manually adjust the mapping before finalizing the import. + + +## Before you import: Preparation steps + +**Verify your table structure:** Ensure your existing table has the correct field types configured. Importing dates into text fields or numbers into single-select fields causes mismatches. Review your [field types](/user-docs/baserow-field-overview) before importing. + +**Prepare your import file:** Match column headers in your import file to field names in your Baserow table for automatic mapping. Clean your data by removing empty rows, ensuring consistent formatting, and verifying special characters display correctly. For updates rather than new rows, include a unique identifier column (like ID or email) that exists in both your file and table. + +**Decide update strategy:** Choose whether to append all rows as new records or update existing records when matches are found. Updating prevents duplicates but requires matching logic, while appending is simpler but may create duplicate entries if the same data is imported twice. + + +## How to import into an existing table + +1. Open the table where you want to add data +2. Click the ellipsis `•••` beside any view name to open view settings +3. Select **Import file** from the dropdown menu +4. Choose your file type (CSV, JSON, XML, or paste data) +5. Upload your file or paste data directly +6. Review field mapping to ensure columns align with the correct fields +7. Choose update behavior: + - Leave unchecked to append all rows as new records + - Check ""Update rows if they already exist"" to refresh matching records +8. Click **Import** to complete the process + + +## Understanding field mapping + +Field mapping connects columns in your import file to fields in your Baserow table. Baserow attempts automatic mapping by matching column headers to field names, but you have full control to adjust these connections. + +**Automatic mapping works when:** Your import file's column headers exactly match your table's field names. For example, if your table has fields named ""Customer Name,"" ""Email,"" and ""Purchase Date,"" and your CSV has columns with identical names, Baserow maps them automatically. + +**Manual mapping is needed when:** Column headers don't match field names exactly, you want to import a column into a different field than the name suggests, or you're importing only some columns and want to skip others. + +**Preview your mapping:** Toggle between ""Import Preview"" and ""File Content"" views to compare how your source data will map to table fields. The Import Preview shows exactly what will appear in your table after import, while File Content shows your original file structure. This comparison helps catch mapping errors before finalizing the import. + +**Handling incompatible data:** If imported data doesn't match the field type (like text into a number field), those cells remain empty after import. Review the preview carefully to identify potential mismatches and fix them in your source file or adjust field types before importing. + +## Update vs. append: Choosing the right strategy + +### Append new records (default) + +Every row in your import file creates a new record in your table, regardless of whether similar data already exists. This is the simplest option and works well when you're certain your import contains only new information. + +**Best for:** Importing time-series data (daily sales reports), adding new entries (new customer signups), and situations where duplicates aren't a concern or will be cleaned up later. + +### Update existing records + +When you check ""Update rows if they already exist,"" Baserow compares imported rows to existing records and updates matches instead of creating duplicates. This requires your table to have a unique identifier field (like ID, email, or order number) that exists in both your table and import file. + +**How matching works:** Baserow uses the primary field or a unique identifier you specify to find matches. When a match is found, that row is updated with new values from your import. Rows without matches are added as new records. + +**Best for:** Refreshing data from external systems (updating inventory levels, syncing CRM contacts), correcting information in bulk (fixing addresses or phone numbers), and maintaining single-source-of-truth without manual deduplication. + + +## Special field handling + +**Link to table fields:** The importer automatically creates relationships when you import into [link to table fields](/user-docs/link-to-table-field). If your import contains references to records in other tables (like customer IDs or product codes), Baserow finds the matching records and establishes the links. + +**Single and multiple select fields:** When importing into [single select](/user-docs/single-select-field) or [multiple select](/user-docs/multiple-select-field) fields, Baserow automatically creates new options if they don't exist. For example, importing ""Red"" and ""Blue"" into a color select field that only has ""Green"" will add Red and Blue as new options. + +**Date and number fields:** Data must match the expected format. Dates should follow ISO format (YYYY-MM-DD) or your region's standard format. Numbers should use consistent decimal separators. Text in these fields results in empty cells after import. + + + +## Frequently asked questions + +### What happens if my imported data doesn't match field types? + +Cells with incompatible data remain empty after import. For example, importing ""N/A"" into a number field leaves that cell blank. Review the import preview before finalizing to identify mismatches, then either fix your source data or temporarily change field types to accommodate the import. + +### Can I import data into some fields but not others? + +Yes, during field mapping, you can choose which columns to import and which to ignore. Fields not included in the mapping remain unchanged, preserving existing data. This is useful when your import file contains extra columns you don't need in Baserow. + +### How do I avoid creating duplicate records? + +Use the ""Update rows if they already exist"" option and ensure your table has a reliable unique identifier field (email, ID number, SKU, etc.). Baserow uses this field to match imported rows with existing records. Without a unique identifier, every import creates new rows even if the data looks identical. + +### What's the maximum number of rows I can import? + +You can import up to 5,000 rows at once into existing tables. For larger datasets, split your import file into multiple batches under 5,000 rows each. Import them sequentially, using update mode if needed to avoid duplicates across batches. + +### Can I undo an import if something goes wrong? + +Within 5 seconds of completing an import, an undo button appears at the bottom-right of your screen. Click it to instantly reverse the import. After 5 seconds, you can [restore from trash](/user-docs/data-recovery-and-deletion) if you delete affected rows. + + + +## Troubleshooting common issues + +**Field mapping looks wrong:** Column headers in your import file likely don't match field names in your table. Manually adjust the mapping before importing, or rename columns in your source file to match exactly. + +**Select field options not appearing:** Ensure your import data matches existing options exactly, including capitalization and spacing. Baserow creates new options automatically, but typos create unintended duplicates (""Red"" vs. ""red""). + +**Date fields showing empty:** Your date format may not be recognized. Use ISO format (YYYY-MM-DD) or your region's standard format. Dates written as text (""January 1st"") won't import correctly. + +**Update mode not finding matches:** Your unique identifier field may contain slight variations (extra spaces, different capitalization). Clean your data to ensure exact matches, or use the primary field which Baserow always uses for matching. + +**Import job stuck or pending** + +If import shows ""pending"" or ""running"" for extended periods, it could be because of system timeout or file processing issues. Jobs automatically fail and clear after 90-95 minutes. Wait for the timeout, then try again with a smaller file or a different format. + +## Related content + +**Work with imported data:** +- **[Field types overview](/user-docs/baserow-field-overview)** – Understand all available field types for better imports +- **[Filter and sort](/user-docs/filters-in-baserow)** – Find and organize newly imported data +- **[Create views](/user-docs/create-custom-views-of-your-data)** – Visualize imported data in different ways + +**Alternative methods:** +- **[Create table via import](/user-docs/create-a-table-via-import)** – Start fresh with new tables from files +- **[Create rows manually](/user-docs/how-to-make-new-rows)** – Add individual records one at a time +- **[Paste data into cells](/user-docs/paste-data-into-baserow-table)** – Quick copy-paste for small updates + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account. + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/b23ea9f0-9a3b-43c3-874f-86ad3641d3b1/Merge%20or%20upsert%20rows%20during%20additional%20import.jpg",,baserow_user_docs,https://baserow.io/user-docs/import-data-into-an-existing-table +112,Permissions overview,permissions-overview,Baserow Permissions overview,"# Permissions overview + +Permissions determine what members can do within workspaces, databases, and tables. As a workspace admin, you assign roles when inviting members or creating teams, then adjust access as your needs evolve. + +This guide covers how to understand Baserow's permission system, compare free vs. paid role-based access control, and learn which approach fits your security needs. + +## Overview + +Baserow's permission system lets you control who can view, edit, or manage your data—from simple workspace membership on Free plans to granular role-based access control on Advanced and Enterprise plans. + +The right permission strategy depends on your plan, team size, and security requirements. This guide helps you understand your options and choose the best approach. + +## Permission system comparison + +### Free and Premium plans: Basic roles + +Free and Premium plans offer two workspace-level roles: + +| Role | Capabilities | Best For | +|------|-------------|----------| +| **Admin** | Manage workspace: members, settings, billing, all databases | Team leads, workspace owners | +| **Member** | Create and manage databases, tables, views; full data access | All team members | + +Workspace creator becomes Admin automatically. Workspace admins invite workspace members with full access to workspace content. Workspace members can create, edit, and delete databases, tables, and data. No granular control, and workspace members have broad permissions + +This is best for small teams (2-10 people), high-trust environments, projects where everyone needs similar access, and teams on limited budgets. + +### Advanced and Enterprise plans: Role-based access control + +Advanced and Enterprise plans add roles with granular permissions: + +| Role | Access Level | Typical Users | +|------|-------------|---------------| +| **Admin** | Full control over workspace, members, and all content | Department heads, workspace managers | +| **Builder** | Create/modify databases, tables, fields, views | Application developers, power users | +| **Editor** | Add, edit, delete data; cannot modify structure | Data entry team, content managers | +| **Commenter** | View data and add comments; no editing | Reviewers, stakeholders, clients | +| **Viewer** | Read-only access to data | Reporting users, executives, observers | +| **No Role** | No default access; requires team or explicit grants | (Strategic use for security) | +| **No Access** | Explicitly blocked from accessing content | Suspended users, restricted members | + +This is best for medium to large teams (10+ people), organizations with sensitive data (HR, finance), client-facing workspaces with external collaborators, compliance-driven environments (HIPAA, GDPR, SOC 2), and departments with different access needs. + +Learn more about [role capabilities](/user-docs/set-permission-level) and [role hierarchy](/user-docs/role-based-access-control-rbac). + + +## How role-based access control works + +### Permission structure + +Advanced and Enterprise plans let you assign roles at levels of specificity. Assign roles at workspace, database, or table levels. + +``` +Workspace Level (default baseline) + ↓ can be overridden at +Database Level (project/department access) + ↓ can be overridden at +Table Level (granular control) +``` + +**Example scenario:** + +Marketing Team has **Editor** role at workspace level → can edit everywhere, has **Viewer** on Finance Database → can only view finance data, and Sarah (in Marketing) has **Admin** on Campaign Table → Sarah can admin that specific table + +More specific roles override broader ones (table > database > workspace). Learn more about [how role hierarchy works](/user-docs/role-based-access-control-rbac). + +### Individual vs. team permissions + +Individual member roles override team roles. Create teams with default roles, then customize exceptions. + +You can assign roles to **Individual members** for Direct role assignment or **Teams** for Groups of members with shared roles. When both exist, Individual assignments always override team roles. + +This flexibility lets you set team defaults while making member-specific exceptions. Learn how to [create and manage teams](/user-docs/create-and-manage-teams). + + + + +## Plan upgrade and downgrade considerations + +### What happens when your Advanced/Enterprise plan expires? + +> ⚠️ **Important:** If your Advanced plan or Enterprise license expires, role-based permissions deactivate **immediately**. All users automatically become Members (Builder equivalent) with full workspace access. + +**Before expiration,** document your permission structure, identify sensitive databases that will become accessible, and plan transition to Free/Premium plan structure or renew license. + +**After expiration**, all granular roles reset to Member, teams remain but lose role assignments, and you must manually restructure workspace access on the Free/Premium plan + +Learn more about [Baserow subscriptions](/user-docs/subscriptions-overview). + + + +## Getting started with permissions + +For new workspaces + + 1. **Determine your plan needs**: Small trusted team? → Free/Premium (Admin + Member roles). Need granular control? → Advanced/Enterprise (full RBAC) + 2. **Design your permission structure**: Who needs what level of access? Which data is sensitive and needs restrictions? Will you use teams or individual assignments? + 3. **Implement your design**: [Invite workspace members](/user-docs/working-with-collaborators), +[Create teams](/user-docs/create-and-manage-teams), and [Assign roles](/user-docs/assign-roles-to-members-at-workspace-level) at appropriate levels + +Learn how to [implement these strategies](/user-docs/assign-roles-to-members-at-workspace-level#advanced-role-configuration-strategies). + +## Frequently asked questions + +### Do I need Advanced or Enterprise plans for role-based permissions? + +Yes. Free and Premium plans only offer Admin and Member roles. Advanced and Enterprise plans provide Builder, Editor, Commenter, Viewer, and No Role options with hierarchy. + +### Can I try role-based permissions before upgrading? + +Advanced plans include a free trial period. Test role-based permissions with your team before committing. [View pricing options](https://baserow.io/pricing). + +### What's the difference between ""No Role"" and ""No Access""? + +- **No Role** – Member gets access through team memberships only (strategic choice) +- **No Access** – Explicitly blocked from accessing content (restriction) + +Learn more about [using ""No Role"" strategically](/user-docs/assign-roles-to-members-at-workspace-level#advanced-role-configuration-strategies). + +### Can Free plan users control who sees specific tables? + +No. Free and Premium plans don't support granular permissions. All Members have full access to all workspace content. Upgrade to Advanced/Enterprise for table-level control. + +### How do I restrict client access to only their project data? + +Use Advanced or Enterprise plans: Create a team for each client, assign the team a Viewer or Commenter role, and Grant access only to their specific database or tables + +Learn more about [client access strategies](/user-docs/assign-roles-to-members-at-workspace-level#customize-permissions-for-specific-needs). + +### Are permissions the same on self-hosted and cloud versions? + +Free/Premium roles work the same. Role-based access control requires a **Cloud** Advanced plan subscription or **Self-hosted:** Enterprise license. + +[Learn about self-hosted licensing](/user-docs/enterprise-license-overview). + + +## Related content + +**Understand the system:** + - [Role hierarchy explained](/user-docs/role-based-access-control-rbac) + - [Role capabilities reference](/user-docs/set-permission-level) + +**Implement permissions:** + - [Assign roles to members at workspace level](/user-docs/assign-roles-to-members-at-workspace-level) + - [Assign roles to teams at workspace level](/user-docs/assign-roles-to-teams-at-workspace-level) + - [Assign roles at database level](/user-docs/assign-roles-at-database-level) + - [Assign roles at table level](/user-docs/assign-roles-at-table-level) + +**Manage teams and members:** + - [Create and manage teams](/user-docs/create-and-manage-teams) + - [Add workspace collaborators](/user-docs/working-with-collaborators) + - [Manage workspace members](/user-docs/manage-workspace-permissions) + +**Billing and plans:** + - [Baserow pricing](https://baserow.io/pricing) + - [Subscriptions overview](/user-docs/subscriptions-overview) + - [Enterprise license overview](/user-docs/enterprise-license-overview) + +**Free and Premium plans:** +- [Invite members to workspace](/user-docs/working-with-collaborators) +- [Manage workspace members](/user-docs/manage-workspace-permissions) + +**Advanced and Enterprise plans:** +- [Understand role hierarchy](/user-docs/role-based-access-control-rbac) +- [Review role capabilities](/user-docs/set-permission-level) +- [Assign workspace-level roles](/user-docs/assign-roles-to-members-at-workspace-level) +- [Create and manage teams](/user-docs/create-and-manage-teams) +- [Assign database-level roles](/user-docs/assign-roles-at-database-level) +- [Assign table-level roles](/user-docs/assign-roles-at-table-level) + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account",,baserow_user_docs,https://baserow.io/user-docs/permissions-overview +113,Member workspace roles,assign-roles-to-members-at-workspace-level,Assign workspace roles to members in Baserow,"# Assign roles to members at workspace level + +Workspace-level roles set the default permissions each member has across all databases and tables within a workspace; creating a baseline that can be refined with database and table-level exceptions. + +This guide covers how to assign, modify, and optimize workspace-level roles for individual members, understand role inheritance and precedence, and implement custom permission configurations. + +> **Paid feature:** Role-based permissions are available on Baserow Advanced and Enterprise plans. [View pricing details](https://baserow.io/pricing). + + +## Overview + +When you assign a role to a member at the workspace level, that role automatically applies to everything in the workspace unless you create specific overrides at the [database][1] or [table][2] level. This creates a permission foundation that balances broad access with targeted control. + +Individual member roles always take precedence over [team roles][3]. If a member belongs to teams with different roles, their individual workspace-level assignment determines their actual permissions, not their team memberships. + +## How workspace-level member roles work + +Prerequisites: Before assigning roles, you must first [invite members to your workspace][4]. This article focuses on role assignment, not invitation workflows. + +### Role assignment and inheritance + +``` +Member's Workspace Role (default baseline) + ↓ +Database-level overrides (optional refinements) + ↓ +Table-level overrides (most specific) + +Individual member roles ALWAYS override team roles +``` + +**Key principles:** +- **Workspace role = default** – Applies everywhere unless overridden +- **Individual > Team** – Member-specific roles take precedence over team roles +- **Specific > General** – Table overrides beat database, database beats workspace +- **Highest permission wins** – When multiple sources exist, highest prevails + +Learn more about [role capabilities](/user-docs/set-permission-level). + +![Inviting a member to workspace][5] + +## Assign or modify member roles + +### Assign roles during invitation + +When inviting new members, you set their initial workspace-level role in the invitation dialog. Once accepted, this becomes their default role across all workspace content. + +Learn more about [inviting workspace members](/user-docs/working-with-collaborators). + +### View current member roles + +To see the roles assigned to a specific member: + + 1. Open your workspace from the dashboard + 2. Select **Members** in the sidebar + 3. The Members page displays all workspace members and their current default and highest roles + +This helps troubleshoot access issues and audit permission structures. + +### Change an existing member's role + +1. On the Members page, locate the member whose role you want to change +2. Click the **role dropdown** next to their name +3. Select the new role from the list +4. The change applies immediately across the entire workspace + +> Use the search box to quickly find specific members in large workspaces. + + +### Track permission changes + +Audit logs record role assignment changes, member additions/removals, permission override modifications, and team membership changes. + +Learn more about [audit logs](/user-docs/admin-panel-audit-logs). + + +## Advanced role configuration strategies + +### Strategy 1: Broad access with exceptions + +Assign generous workspace-level roles, then restrict specific areas. This is recommended with open collaboration environments where most members need wide access, and only a few sensitive databases/tables need protection + +**Implementation:** +1. Assign a broad role at the workspace level to all regular members +2. Create **database-level overrides** for sensitive data (e.g., HR, Finance) +3. Set **Viewer** or **Commenter** on restricted databases +4. Grant **Admin** access to specific members who need it + +**Example configuration:** +``` +All members: Editor at workspace level + ├── HR Database: Viewer for most members, Admin for HR team + ├── Finance Database: Commenter for department leads, Admin for finance team + └── All other databases: Editor (inherited from workspace) +``` + +### Strategy 2: Restrictive baseline with targeted grants + +Assign **No Role** at the workspace level, grant access through teams or individual permissions. This is recommended with high-security requirements, a need-to-know access model, a contractor/consultant-heavy workforce, and compliance-driven organizations. + +**Implementation:** +1. Set all members to **No Role** at workspace level +2. Create teams for different access patterns +3. Assign team roles at the database/table level only +4. Grant individual exceptions as needed + +**Example configuration:** +``` +All members: No Role at workspace level + ├── Team A: Editor on Database 1 + ├── Team B: Viewer on Database 1, Editor on Database 2 + ├── External Contractors: Commenter on Project Database only + └── Leadership: Admin on all databases via individual grants +``` + +> **Best practice:** The ""No Role"" strategy provides maximum control but requires more setup. Document your permission structure to maintain consistency. + +### Strategy 3: Role-based segregation + +Align workspace roles with job functions or departments. This is recommended when there is a clear organizational hierarchy, functional teams with distinct responsibilities, and the need to mirror real-world organizational structure in permissions. + +**Implementation:** +1. Map job roles to Baserow roles (e.g., Analysts → Viewer, Contributors → Editor) +2. Assign workspace-level role based on primary job function +3. Use database/table overrides for cross-functional projects +4. Leverage teams for project-specific access + +**Example configuration:** +``` +Executives: Admin at workspace level +Managers: Builder at workspace level +Contributors: Editor at workspace level +Analysts: Viewer at workspace level +External Partners: No Role + team-based access +``` + + +## Member vs. team role precedence + +When a member has both individual and team-based roles, individual workspace-level assignments always take precedence over team roles. + +**Key principle:** Your workspace-level individual role overrides all team-based workspace roles. + +**Quick examples:** +- Individual **Editor** + Team **Admin** → You get **Editor** +- Individual **No Role** + Team **Editor** → You get **Editor** (team provides access) +- Individual **Viewer** + Multiple teams with higher roles → You get **Viewer** + +For complete precedence rules including database and table levels, see [Understanding role hierarchy](/user-docs/role-based-access-control-rbac). + + + + + +## Frequently asked questions + +### Do workspace-level roles apply to new databases automatically? + +Yes. When someone creates a new database in the workspace, all members automatically have their workspace-level role on that database unless you set specific overrides. + +### Can I assign different roles to the same member on different databases? + +Yes. Workspace-level roles are defaults. You can override them at the database or table level for any member. The workspace role only applies where no overrides exist. + +### What's the difference between ""No Role"" and removing a member? + +""No Role"" keeps the member in the workspace with no default access; they can still receive team-based or explicit database/table permissions. Removing a member deletes them from the workspace entirely and revokes all access. + +### How do I give a member admin access to one database but not others? + +Keep their workspace-level role as **Editor** or **Viewer**, then add a database-level override with **Admin** role on the specific database they should manage. + +### If I change a member's workspace-level role, what happens to their existing overrides? + +Database and table-level overrides remain in place. Only areas without overrides are affected by the workspace-level role change. + +### Should I use workspace-level roles or team roles? + +Use workspace-level roles for individual members who need consistent permissions across the workspace. Use team roles when groups of members share the same access patterns. Combine both for maximum flexibility, with individual overrides taking precedence. + +### Can a member with ""No Role"" at the workspace level still access anything? + +Only if they have team memberships or explicit database/table permissions. ""No Role"" at the workspace level means no default access, but other permission sources can still grant access. + + +## Related content + +**Permission assignment:** +- [Assign roles to teams at workspace level](/user-docs/assign-roles-to-teams-at-workspace-level) +- [Assign roles at database level](/user-docs/assign-roles-at-database-level) +- [Assign roles at table level](/user-docs/assign-roles-at-table-level) + +**Understanding permissions:** +- [Permissions overview](/user-docs/permissions-overview) +- [Understand role hierarchy](/user-docs/role-based-access-control-rbac) +- [Role levels in Baserow](/user-docs/set-permission-level) + +**Member management:** +- [Add workspace collaborators](/user-docs/working-with-collaborators) +- [Manage workspace members](/user-docs/manage-workspace-permissions) +- [Remove a member from workspace](/user-docs/remove-a-user-from-a-workspace) + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](https://baserow.io/contact) for questions about Baserow or help with your account + + + [1]: https://baserow.io/user-docs/assign-roles-at-database-level + [2]: https://baserow.io/user-docs/assign-roles-at-table-level + [3]: https://baserow.io/user-docs/assign-roles-to-teams-at-workspace-level + [4]: https://baserow.io/user-docs/working-with-collaborators + [5]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/86a76bff-c8e3-4c72-95a2-ed5609fecf5d/Inviting%20a%20member%20to%20workspace.jpg",,baserow_user_docs,https://baserow.io/user-docs/assign-roles-to-members-at-workspace-level +114,Team workspace roles,assign-roles-to-teams-at-workspace-level,Baserow: Assign Roles to Teams (Workspace),"# Assign roles to teams at workspace level + +Assigning roles to teams at the workspace level lets admins control permissions for entire groups in one action, with automatic inheritance throughout databases and tables. + +This guide covers how to assign and modify roles for teams at the workspace level, understand role hierarchy and inheritance, and implement advanced permission strategies for bulk access control. + +> **Paid feature**: Role-based permissions are available on the Baserow Advanced and Enterprise plans. [View pricing details](https://baserow.io/pricing). + +## Overview + +When you assign a default role to a team at the workspace level, every team member automatically receives that role across the entire workspace and all its contents; unless you set specific exceptions at the database or table level. This bulk permission management is more efficient than assigning roles individually, especially for organizations with structured departments or project groups. + +> Team roles work alongside [individual member roles][1]. When conflicts occur, individual permissions always take precedence over team permissions. This allows you to set broad team defaults while making targeted exceptions for specific members. + +## How workspace-level team roles work + +### Role assignment hierarchy + +Workspace-level team roles follow a clear inheritance pattern: + +``` +Workspace Team Role (default) + ↓ +Database-level exceptions (optional) + ↓ +Table-level exceptions (optional) + ↓ +Individual member overrides (highest priority) +``` + +**Example scenario:** + +- Marketing Team has **Editor** default role at workspace level, can view and edit all workspace content. +- Specific override: Restrict them to the **Commenter** role on the Finance Database +- Individual override: Sarah in the Marketing Team has the **Admin** role on the Budget Table in the Finance Database + +**Result:** Marketing Team maintain Editor access everywhere else except Finance Database (comment only), but Sarah can admin the Budget Table + +### When to use workspace-level team roles + +| Use Case | Why It Works | +|----------|--------------| +| **Department-wide access** | Give entire departments consistent permissions across all workspace content | +| **Client teams** | Assign external client teams Viewer or Commenter access to specific project data | +| **Project groups** | Create temporary teams for projects with unified access needs | +| **Role-based groups** | Organize by function (Editors, Reviewers, Analysts) rather than organizational structure | + +When you remove a member from a team, they immediately lose all team-based permissions but retain any individual permissions assigned directly to them. Learn more about [managing team membership](/user-docs/create-and-manage-teams). + +## Assign or modify team roles + +**Prerequisites:** Before assigning roles to teams, you must first [create a team](/user-docs/create-and-manage-teams) and [invite members to your workspace](/user-docs/assign-roles-to-members-at-workspace-level). + +### View current team roles + +1. Open your workspace from the dashboard +2. Select **Members** in the sidebar to open the Members page +3. Click the **Teams** tab to view all workspace teams + +The Teams tab displays each team's current default role at the workspace level. + +### Change a team's default role + +1. On the **Teams** tab, locate the team you want to modify +2. Click the **default role dropdown** next to the team name +3. Select the new role from the list: + +![Change team role dropdown in baserow][2] + +The role change applies immediately to all team members across the workspace, unless they have individual permission overrides. + +## Advanced permission strategies + +Teams can be organized hierarchically by [assigning roles to teams at workspace level](/user-docs/assign-roles-to-teams-at-workspace-level). + +### Strategy 1: ""No Role"" baseline with targeted access + +For maximum control over permissions, use this recommended approach: + +1. **Assign individual members ""No Role""** at workspace level ([learn how](/user-docs/assign-roles-to-members-at-workspace-level)) +2. **[Create teams][3]** and add members to appropriate teams +3. **Assign team roles** at database and table levels only (not workspace level) + +**Why this works:** Members have no default access. They only get permissions through their team memberships at specific database/table levels. This prevents accidental access and creates a ""least privilege"" security model. + +Individual permissions always take precedence over team permissions. Learn more about [role hierarchy](/user-docs/role-based-access-control-rbac). + +**Example implementation:** +``` +All individual members: No Role at workspace level + ├── Finance Team: No role at workspace → Admin on Finance Database + ├── Marketing Team: No role at workspace → Editor on Campaigns Database + └── External Reviewers: No role at workspace → Viewer on Reports Database +``` + +### Strategy 2: Team hierarchies + +Create nested permission structures where higher teams can access everything lower teams own. Assign broader roles (e.g., Editor) to leadership teams, assign narrower roles to operational teams, and then higher-level teams can inherit access to lower-level content. + +Learn more about [role hierarchy](/user-docs/role-based-access-control-rbac). + +### Strategy 3: Exception-based permissions + +Set generous workspace-level team roles, then restrict access where needed: + +1. Assign the team a broad role (e.g., Editor) at the workspace level +2. Set **database-level exceptions** for sensitive content ([database permissions](/user-docs/assign-roles-at-database-level)) +3. Set **table-level exceptions** for specific restrictions ([table permissions](/user-docs/assign-roles-at-table-level)) + +**Example:** +- Sales Team: **Editor** at workspace level +- Exception: **Commenter** on Commission Database +- Exception: **Viewer** on Management Reports Table + + +## Frequently asked questions + +### Do workspace-level team roles apply to new databases and tables? + +Yes. When you create new databases or tables, team members automatically have their workspace-level team role on the new content, unless you set specific exceptions. + +### Can I see all permissions a team member has? + +Yes. On the Members page, click on an individual member to view their complete permission set, including both individual and team-based permissions across all databases and tables. + +### What happens if I change a team's role after setting database exceptions? + +Database and table-level exceptions remain in place. Changing the workspace-level team role only affects areas where no exceptions exist. + +### Should I use teams or individual permissions? + +Use teams when multiple members need the same permissions. Use individual permissions when specific members need unique access that differs from their team. Combining both provides maximum flexibility. + +### How do I audit team permissions across my workspace? + +Navigate to the Members page to view all teams and their roles. For detailed permission tracking, audit logs record all permission changes. Learn more about [audit logs](/user-docs/admin-panel-audit-logs). + +### Can a member belong to multiple teams with different roles? + +Yes. When a member belongs to multiple teams, they receive the highest permission level from any team they're part of. Individual permissions still override all team permissions. + + + +## Related content + +- [Create and manage teams](/user-docs/create-and-manage-teams) +- [Understand role hierarchy](/user-docs/role-based-access-control-rbac) +- [Role levels in Baserow](/user-docs/set-permission-level) +- [Assign roles to members at workspace level](/user-docs/assign-roles-to-members-at-workspace-level) +- [Assign roles at database level](/user-docs/assign-roles-at-database-level) +- [Assign roles at table level](/user-docs/assign-roles-at-table-level) +- [Permissions overview](/user-docs/permissions-overview) + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow.io/user-docs/assign-roles-to-members-at-workspace-level + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/ddca27e1-6b7c-4fb2-a14e-3df8c902a623/Change%20team%20role%20dropdown.jpg + [3]: https://baserow.io/user-docs/create-and-manage-teams",,baserow_user_docs,https://baserow.io/user-docs/assign-roles-to-teams-at-workspace-level +115,Database permissions,assign-roles-at-database-level,Assign roles at database level in Baserow,"# Database level permissions + + +Database roles provide the middle layer of Baserow's permission hierarchy, offering more control than [workspace-wide roles][1] while being easier to manage than [table-by-table assignments][2]. + +This guide covers how to assign roles at the database level to create department-specific access, protect sensitive databases, and override [workspace-wide defaults][1] for targeted permission control. + +> **Paid feature:** Role-based permissions are available on Baserow Advanced and Enterprise plans. [View pricing details](https://baserow.io/pricing). + +## Overview + +Database-level roles let you create permission boundaries around specific databases, giving members and teams different access to individual projects, departments, or client workspaces without changing their [workspace-wide permissions][1]. + +When you assign a role at the database level, it applies to all tables within that database and overrides any [workspace-wide role assignments][1]. This creates natural permission boundaries; perfect for departmental databases (HR, Finance, Sales), client-specific projects, or sensitive data that requires restricted access. + + +> **Prerequisites:** Members must first be [invited to the workspace](/user-docs/working-with-collaborators) before you can assign database-level roles. You cannot invite members directly to a database. + + + +## When to use database-level roles + +### Common use cases + +| Scenario | Implementation | Why Database Level Works | +|----------|----------------|-------------------------| +| **Department isolation** | Sales database: Sales Team (Editor), Finance database: Finance Team (Editor) | Each team can edit their department's data but not others' | +| **Client projects** | Client A database: Client A Team (Viewer), Client B database: Client B Team (Viewer) | Clients see only their project data, not other clients' | +| **Sensitive data protection** | HR database: HR Team (Admin), all others (Viewer or No Access) | Restrict payroll/personnel data while keeping the rest open | +| **Development stages** | Production database: Developers (Viewer), Staging database: Developers (Editor) | Prevent accidental edits to production while allowing staging work | +| **External collaborators** | Contractor A: Editor on Project Alpha database only | Grant project-specific access without workspace-wide permissions | + +### Database vs. workspace vs. table roles + + - **Use [workspace-level roles][1] when** members need consistent access across all databases, you have a small, trusted team, or most databases have similar sensitivity levels + - **Use database-level roles when** different groups need access to different databases, departments, or projects have distinct data boundaries, or some databases are more sensitive than others + - **Use [table-level roles][2] when** need granular control within a database, individual tables require special restrictions, or specific sensitive tables (e.g., salary table in HR database) + +Learn more about [role hierarchy](/user-docs/role-based-access-control-rbac). + + +## How database roles work + +### Override behavior + +Database-level roles **override [workspace-level roles][1]** but are **overridden by [table-level roles][2]**: + +``` +Workspace Role (baseline) + ↓ overridden by +Database Role (applies to this database + all its tables) + ↓ overridden by +Table Role (most specific) +``` + +**Example:** Sarah has **Editor** role at workspace level, has **Viewer** role on Finance Database, has **Admin** role on Budget Table (in Finance Database). Sarah can edit everywhere except the Finance Database (view only), but has admin access specifically to the Budget Table + +### Inherited vs. explicit access + +> The database members list shows only **explicit assignments**, not inherited access. Always check both [workspace][1] and database role assignments when troubleshooting access + +This means a workspace Admin can access all databases, but won't appear in individual database member lists unless you explicitly assign a database-level role. The database member list shows only **exceptions to workspace defaults** + +This matters because you might think a database has no members, but [workspace-wide roles][1] still grant access. To truly restrict a database, assign ""No Access"" to workspace members at the database level. + +## Assign roles at the database level + +### Grant database access to members or teams + +1. Navigate to the database you want to manage +2. Click the **three-dot menu (⋮)** next to the database name in the sidebar or home page +3. Select **Manage members** from the dropdown +4. In the Manage Members modal, click **Select Members** + + ![Manage database members option in Baserow][3] + +5. Search and select members and/or teams using individual checkboxes, or the **Select all** button for bulk selection. The modal shows the total members selected + +6. Choose the role from the dropdown + +7. Click **Invite members/teams** + +The role applies immediately to all tables in the database. + +> [Assign roles to teams][4] rather than individual members when multiple people need the same database access; it's easier to manage as team membership changes. + + + +## View and modify database access + +### View current database members + +The Manage Members modal displays all members and teams with **explicit database-level role assignments**. + + +> ⚠️ **Important:** This list only shows explicit database assignments. Members with workspace-level access may still access this database, but it won't appear here unless they have a database-specific role assignment. +> + +**To see all effective access:** +1. Check [workspace-level roles][1] (Members page) +2. Check database-level exceptions (Manage Members on database) +3. Check [table-level exceptions][2] (Manage Members on tables) + +![Baserow Database members view image][5] + + +### Change existing roles + +1. Open the database's **Manage members** modal +2. Locate the member or team to modify +3. Click the **role dropdown** next to their name +4. Select the new role + +Changes apply immediately to all tables in the database. + +### Remove database access + +To revoke database-level access: +1. Open **Manage members** on the database +2. Select **Remove** from the role dropdown for that member/team + +The workspace member loses database-level override and falls back to their assigned [workspace-level role][1] (if any). If the workspace-wide role is also restrictive, the member loses all database access + +> Removing database-level access cannot be undone directly; you must re-assign the role. + + +## Database-level permission strategies + +### Strategy 1: Department databases with isolation + +Each department manages its own database, and others can view it. Departments control their data, and sensitive databases (HR, Finance) are fully isolated. + +**Implementation:** +1. Create separate databases: HR, Finance, Sales, Marketing +2. Workspace level: Set all members to **Viewer** +3. Database level: + - HR Database: HR Team → **Admin**, others → **No Access** + - Finance Database: Finance Team → **Admin**, others → **No Access** + - Sales Database: Sales Team → **Editor** + - Marketing Database: Marketing Team → **Editor** + +### Strategy 2: Client project databases + +Each client sees only their project database. Perfect client isolation; each client accesses only their data. + +**Implementation:** +1. Create a database per client: ""Client A Project"", ""Client B Project"" +2. Workspace level: Set all clients to **No Role** +3. Database level: + - Client A Project DB: Client A Team → **Viewer** or **Commenter** + - Client B Project DB: Client B Team → **Viewer** or **Commenter** + - Internal team: **Editor** on all client databases + +### Strategy 3: Production vs. staging environments + +Protect the production database while allowing development work. Developers can freely work in staging, but can't accidentally edit production. + +**Implementation:** +1. Create two databases: ""Production"" and ""Staging"" +2. Workspace level: Developers → **Editor** +3. Database level: + - Production Database: Developers → **Viewer**, Admins → **Admin** + - Staging Database: Developers → **Editor** (inherited from workspace) + +### Strategy 4: Graduated access model + +Leadership sees everything; teams see department data. Hierarchical access matching org structure. + +**Implementation:** +1. Multiple department databases +2. Workspace level: Leadership → **Admin**, teams → **No Role** +3. Database level: + - Each department DB: Department Team → **Editor** + - Leadership team: inherits **Admin** from workspace + +## Troubleshooting database access + +### ""Why can this member access the database when they're not in the list?"" + +This is because they have [workspace-level access][1] that isn't overridden at the database level. Check their workspace roles. To restrict, assign ""No Access"" at the database level. + +### ""I removed someone, but they can still access tables"" + +This is because they may have [table-level role assignments][2] that override database removal. Check individual table permissions and remove table-level access. + +### ""Database Admin can't invite workspace members"" + +Database Admins can only manage database access, not workspace membership. Only workspace Admins can invite members to the workspace. Have a workspace Admin invite a member first, then a database Admin can assign database access. + +### ""Member has Admin on database but can't see it"" + +This is because a workspace member might not have been [invited to the workspace][6], or the database is in a different workspace. [Verify that the user is a workspace member][7] and the database is in the correct workspace. + + + +## Frequently asked questions + +### Do database roles apply to new tables automatically? + +Yes. When you create a new table in a database, all database-level roles automatically apply to that table unless you set [table-specific overrides][2]. + +### Can I assign database roles to members not in the workspace? + +No. Members must first be invited to the workspace before you can assign database-level roles. Workspace membership is required. + +### What's the difference between database ""No Access"" and removing the database assignment? + +They're effectively the same; both prevent database access. ""No Access"" explicitly blocks access, while removing the assignment removes the override (falling back to workspace role). + +### Can a database Admin restrict workspace Admin access? + +Yes. A database Admin can assign ""No Access"" to workspace Admins at the database level, effectively creating a private database even if workspace Admins can't access it (unless they [override at the table level][2]). + +### How do I make a truly private database? + +Set ""No Access"" at the database level for all workspace members except the specific team that should have access. This overrides workspace-level permissions. + +### If I change someone's workspace role, does it affect their database roles? + +No. Explicit database-level roles always override workspace roles. Changing workspace role only affects databases where no database-level override exists. + + + +## Related content + +**Assign roles at other levels:** +- [Assign roles to members at workspace level](/user-docs/assign-roles-to-members-at-workspace-level) +- [Assign roles to teams at workspace level](/user-docs/assign-roles-to-teams-at-workspace-level) +- [Assign roles at table level](/user-docs/assign-roles-at-table-level) + +**Understand the system:** +- [Understanding role hierarchy](/user-docs/role-based-access-control-rbac) +- [Role capabilities reference](/user-docs/set-permission-level) +- [Permissions overview](/user-docs/permissions-overview) + +**Manage access:** +- [Create and manage teams](/user-docs/create-and-manage-teams) +- [Manage workspace members](/user-docs/manage-workspace-permissions) +- [Remove a member from workspace](/user-docs/remove-a-user-from-a-workspace) + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow.io/user-docs/assign-roles-to-members-at-workspace-level + [2]: https://baserow.io/user-docs/assign-roles-at-table-level + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/cdbe4929-abf0-46c6-83ca-f95e2ace5549/Manage%20members%20option.jpg + [4]: https://baserow.io/user-docs/create-and-manage-teams + [5]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/ebdac3b5-57be-4e05-967d-0fb3b7323a72/Baserow%20Database%20members%20view.jpg + [6]: https://baserow.io/user-docs/working-with-collaborators + [7]: https://baserow.io/user-docs/manage-workspace-permissions",,baserow_user_docs,https://baserow.io/user-docs/assign-roles-at-database-level +116,Table permissions,assign-roles-at-table-level,Set user roles for tables in Baserow,"# Table level permissions + +Table-level roles override both workspace and database assignments. This makes them ideal for compliance requirements, protecting confidential data, and creating exceptions for individual tables that need tighter security than their parent database. + +This guide covers how to assign roles at the table level for granular access control, protect sensitive tables like payroll or personal data, and override database and workspace permissions for maximum security. + +> **Paid feature:** Role-based permissions are available on Baserow Advanced and Enterprise plans. [View pricing details](https://baserow.io/pricing). + +## Overview + +Table-level roles provide granular permission control in Baserow, letting you restrict access to specific sensitive tables, like salary data, client contracts, or personal information; even when members have broader access to the database or workspace. + +Use table-level permissions when workspace and database roles are too broad for your security needs. + +## When to use table-level roles + +> **Prerequisites:** Members must first be [invited to the workspace](/user-docs/working-with-collaborators) before you can assign table-level roles. You cannot invite members directly to a table. + +### Common use cases + +| Scenario | Implementation | Why Table Level Works | +|----------|----------------|----------------------| +| **Sensitive salary data** | HR Database (Editor for HR), Salary Table (Admin for CFO only) | Restrict payroll data even within the HR department | +| **Client confidential info** | Project Database (Editor for team), Client Contracts Table (Admin for legal only) | Protect legally sensitive documents from project team | +| **Personal identifiable info (PII)** | Customer Database (Editor), Customer SSN Table (No Access for most) | GDPR/HIPAA compliance for specific fields | +| **Executive-only data** | Company Database (Viewer for all), Board Minutes Table (Admin for executives) | Share some company data broadly, restrict strategic info | +| **Audit/compliance tables** | Finance Database (Editor for finance), Audit Log Table (Viewer for auditors, No Access for others) | Prevent tampering with compliance records | +| **Production configuration** | Settings Database (Viewer for all), API Keys Table (Admin for DevOps only) | Prevent accidental exposure of secrets | + +### Table vs. database vs. workspace roles + +**Use workspace-level roles when:** +- Members need consistent access across everything +- Simple, trust-based environment +- Small team with similar responsibilities + +**Use database-level roles when:** +- Creating department or project boundaries +- Different teams need different database access +- Mid-level granularity is sufficient + +**Use table-level roles when:** +- ✅ Specific tables contain sensitive data within otherwise open databases +- ✅ Compliance requires field-level restrictions +- ✅ Need to restrict access from higher-level admins +- ✅ Individual tables require unique protection +- ✅ Maximum security precision needed + +Learn more about [role hierarchy](/user-docs/role-based-access-control-rbac). + + + +## How table roles work + +Table-level roles have high priority in Baserow's permission hierarchy. + +``` +Workspace Role (baseline) + ↓ overridden by +Database Role (department/project level) + ↓ overridden by +Table Role (override everything) +``` + +**Example:** Marketing Team has **Editor** role at workspace level, and has **Viewer** role on Budget Database. Sarah (Marketing) has **Admin** role on the Campaign Budget Table. Marketing can edit everywhere except the Budget Database (view only), but Sarah specifically has admin on the Campaign Budget Table + +> Table-level ""No Access"" can block even workspace Admins. This is to protect ultra-sensitive data. + +**Example:** A workspace Admin can access everything by default. Salary Table has ""No Access"" for the workspace admin at the table level. The workspace admin cannot access the Salary Table despite being a workspace Admin. + +### Inherited vs. explicit access + +> The table members list shows only **explicit table-level assignments**, not inherited access. Always check the workspace and database roles when troubleshooting table access. + +This means a workspace Editor can edit all tables, but won't appear in individual table member lists unless you assign a table-specific role. The table member list shows only **exceptions to database/workspace defaults** + +This matters because you might think a table has limited access, but workspace/database roles still grant access. To truly restrict, assign ""No Access"" at the table level to override inherited permissions. + +## How to assign table roles + +### Grant table access to members or teams + +To assign roles at the table level, + +1. Navigate to the table you want to manage +2. Click the **three-dot menu (⋮)** next to the table name in the sidebar or home page +3. Select **Manage members** from the dropdown + + ![Manage members option](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/aba38933-be70-4f6c-bc80-5fa6608072c8/Untitled.png) + +4. In the Manage Members modal, click **Select Members** + +5. Search and select members and/or teams using individual checkboxes, **Select all** button for bulk selection. The modal shows the total members selected + +6. Choose the role from the dropdown: + +7. Click **Invite members/teams** (button shows total selected) + +The role applies immediately to this specific table only. + +> **Pro tip:** Use ""No Access"" at the table level to lock down sensitive tables from members who have Editor or Admin access at the workspace/database level. + +## View and modify table access + +### View current table members + +The Manage Members modal displays all members and teams with **explicit table-level role assignments**. + +> ⚠️ **Important:** This list shows only explicit table assignments. Members with workspace or database-level access may still access this table, but it won't appear here unless they have a table-specific role. + +**To see all effective table access:** +1. Check workspace-level roles (Members page) +2. Check database-level roles (Manage Members on database) +3. Check table-level exceptions (Manage Members on table) + +The combination determines final access. + +![Table members view](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/7b06690b-d100-4bd4-8cbd-9271edae03bf/Screenshot_2023-01-18_at_19.10.49.png) + +### Change existing roles + +1. Open the table's **Manage members** modal +2. Locate the member or team to modify +3. Click the **role dropdown** next to their name +4. Select the new role + +Changes apply immediately to this table only. + +### Remove table access + +To revoke table-level access: +1. Open **Manage members** on the table +2. Select **Remove** from the role dropdown for that member/team + +The workspace member loses the table-level override and falls back to the database-level role (if any). If no database role, they fall back to the workspace role. If no roles at any level, they lose all table access. + +> Removing table-level access cannot be undone directly; you must re-assign the role. + +## Table-level permission strategies + +### Strategy 1: Sensitive tables in open databases + +Most tables are accessible, but some tables are locked down. If an HR Database contains salary information, HR can manage most data, but salary and reviews have special restrictions. + +**Implementation:** +1. Database level: HR Team → **Editor** on HR Database +2. Table level: + - Salary Table: CFO → **Admin**, HR Team → **Viewer** + - Performance Reviews Table: HR Managers → **Editor**, HR Staff → **Viewer** + - All other tables: inherited **Editor** from database + +### Strategy 2: Compliance-required restrictions + +Meet GDPR/HIPAA requirements for PII. A customer database containing personally identifiable information needs strict PII protection while maintaining operational access. + +**Implementation:** +1. Workspace level: Customer Success Team → **Editor** +2. Database level: Customer Database → inherited **Editor** +3. Table level: + - Customer SSN Table: **No Access** for all except Compliance Officer → **Admin** + - Customer Medical Table: **No Access** for all except Healthcare Team → **Editor** + - Customer Addresses Table: CS Team → **Viewer** (can see, not edit) + +### Strategy 3: Prevent admin access to ultra-sensitive data + +Even workspace admins can't access certain tables. Board of Directors confidential information receives ultimate protection; even admins can't access these tables. + +**Implementation:** +1. Workspace level: Most users → various roles, including some Admins +2. Database level: Company Database → various roles +3. Table level: + - Board Minutes Table: All workspace Admins → **No Access**, Board Members → **Admin** + - Executive Compensation Table: All except CFO and CEO → **No Access** + +### Strategy 4: Audit trail protection + +Prevent tampering with compliance logs. A financial audit requires a compliance-ready audit trail that can only be modified by auditors. + +**Implementation:** +1. Database level: Finance Database → Finance Team → **Editor** +2. Table level: + - Audit Log Table: All users → **Viewer** (read-only), System Admin → **No Access** (cannot edit even as admin) + - Transaction History Table: Finance Team → **Viewer**, Auditors → **Admin** + +### Strategy 5: Development secrets protection + +Configure the database with production secrets to protect API keys and credentials. Developers can work freely, but can't access or expose production secrets. + +**Implementation:** +1. Database level: Settings Database → Development Team → **Editor** +2. Table level: + - API Keys Table: **No Access** for all except DevOps Lead → **Admin** + - Production Config Table: Developers → **Viewer**, DevOps → **Editor** + - Test Config Table: inherited **Editor** from database + +## Troubleshooting table access + +### ""Why can this member access the table when they're not in the list?"" + +This is because they have workspace or database-level access that isn't overridden at the table level. Check workspace and database roles. To restrict, assign ""No Access"" at the table level. + +### ""I set 'No Access', but the member can still see the table"" + +This is because a workspace member may have a more specific role at the same table level (individual overrides team). Check if the member has an individual table-level role that overrides the team ""No Access"" assignment. + +### ""Table Admin can't invite workspace members"" + +Table Admins can only manage table access, not workspace or database membership. Only workspace Admins can invite members to the workspace. Have a workspace Admin invite a member first, then the table Admin can assign table access. + +### ""Workspace Admin can't access table despite being Admin"" + +This is because the table has explicit ""No Access"" for that admin at the table level. Table-level ""No Access"" overrides the workspace Admin role. This is intentional for ultra-sensitive data. If access is needed, have another table Admin modify the table-level permissions. + +### ""Removed someone from a table, but they can still access it"" + +This is because they have inherited access from workspace or database roles. Removing table-level roles means they fall back to database/workspace roles. To block access, assign ""No Access"" at the table level instead of removing the assignment. + +## Frequently asked questions + +### Can table roles override workspace Admin access? + +Yes. Assigning ""No Access"" at the table level blocks even workspace Admins. This is a powerful way to protect ultra-sensitive data. + +### Can I assign table roles to members not in the workspace? + +No. Members must first be invited to the workspace before you can assign table-level roles. Workspace membership is always required. + +### What's the difference between removing table assignment and ""No Access""? + +- **Remove assignment:** Member falls back to database/workspace role (might still have access) +- **""No Access"":** Explicitly blocks access regardless of database/workspace roles. Use ""No Access"" when you need to override inherited permissions. + +### If I change someone's database role, does it affect their table roles? + +No. Explicit table-level roles always override database and workspace roles. Changing the database role only affects tables where no table-level override exists. + +### How do I audit who has access to a sensitive table? + +Check three places: +1. Table's Manage Members (explicit table assignments) +2. Database's Manage Members (might grant inherited access) +3. Workspace Members page (might grant inherited access) + +Use [audit logs](/user-docs/admin-panel-audit-logs) for tracking permission changes. + +## Related content + +**Assign roles at other levels:** +- [Assign roles to members at workspace level](/user-docs/assign-roles-to-members-at-workspace-level) +- [Assign roles to teams at workspace level](/user-docs/assign-roles-to-teams-at-workspace-level) +- [Assign roles at database level](/user-docs/assign-roles-at-database-level) + +**Understand the system:** +- [Understanding role hierarchy](/user-docs/role-based-access-control-rbac) +- [Role capabilities reference](/user-docs/set-permission-level) +- [Permissions overview](/user-docs/permissions-overview) + +**Manage access:** +- [Create and manage teams](/user-docs/create-and-manage-teams) +- [Manage workspace members](/user-docs/manage-workspace-permissions) +- [Remove a member from workspace](/user-docs/remove-a-user-from-a-workspace) + +**Compliance and security:** +- [Enterprise admin panel](/user-docs/enterprise-admin-panel) +- [Audit logs](/user-docs/admin-panel-audit-logs) + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account",,baserow_user_docs,https://baserow.io/user-docs/assign-roles-at-table-level +117,Enterprise overview,enterprise-license-overview,Baserow Enterprise license details,"# Baserow Enterprise license overview + +Baserow Enterprise plan is designed to support large teams in industries to build databases, collaborate on projects, create applications and workflows, and digitise processes. + +Baserow’s Enterprise version is only available for self-hosted Baserow servers on Baserow version 1.14.0 or greater. It is not available for workspaces on Baserow.io itself. + +## Enterprise features + +Baserow Enterprise provides access to key features and capabilities: + +- **[Role-Based Access Control][1]**: Baserow Advanced and Enterprise plans come with advanced user management to collaborate effectively. Baserow role-based access control (RBAC) helps teams manage complex access protocols, such as vetting who to grant data and resources access to and what they can do with the information. +- **[Administration Panel][2]:** The administration panel enables Instance admins to create access rules and keep an overview of every user license in the company. +- **[Single Sign-On (SSO)][3]:** Baserow Enterprise allows customers to use any multi-tenant SaaS applications to log in using the SSO credentials provided by any identity solution they choose. Users can enjoy unlimited capacity and the ability to choose how they secure their Baserow applications. +- **Direct Priority Support:** Baserow offers functional support to Enterprise customers with operational and deployment support depending on need. Users can gain access to priority support to deploy Baserow across businesses quickly and seamlessly. This works in the form of a live chat that they can open by clicking on a button. +- **Access to all premium features**: Users on the Enterprise plan have access to [premium features][4]. + +## Upgrade to the Baserow Enterprise plan + +Upgrading to the Enterprise plan is a manual process handled by the Baserow sales team. Please [contact a sales representative](https://baserow.io/contact-sales) to get started with the Enterprise plan. + +All users are always upgraded with an enterprise license. An Enterprise licence cannot be combined with any other license. This means that having some users on open source, some on the premium plan, and some on the enterprise plan is not possible. + + +--- + + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we’re ready to assist you. + +   [Ask the Baserow community](https://community.baserow.io) + +   [Contact support](https://baserow.io/contact) for questions about Baserow or help with your account. + + [1]: /user-docs/permissions-overview + [2]: /user-docs/enterprise-admin-panel + [3]: /user-docs/single-sign-on-sso-overview + [4]: /user-docs/subscriptions-overview#baserow-premium-features",,baserow_user_docs,https://baserow.io/user-docs/enterprise-license-overview +118,Admin panel - Users,admin-panel-users,Baserow admin panel: Manage users,"# Admin panel - Users + +The Users page of the Admin Panel lets Instance admins manage and view information about Baserow users from the organization. + +##Overview + +> Instance-wide Admin panel is an Enterprise-level feature. [Refer to this support article](/user-docs/enterprise-license-overview) to learn more about our Enterprise plan and the additional features it provides. +> + +Only Instance admins have access to the Baserow admin panel. + +The Users page allows Instance admins to view: + +- A list of all of the users in their organization. +- The name and email address (username) of each user. +- The workspaces the user is a member of. +- The last login date for a particular user. +- When the user joined. +- Identify the user as Active or Deactivated. + +The ""Last login"" field shows when the user last logged in. Every time a user logs in, the ""Last login"" value on the User page in the admin panel is updated. + +## Individual user actions + +Instance Admins can access user actions by clicking the ellipses (three-dot) icon to the right of the page. By clicking this button, a list of options for modifying that user's account will appear in a new window. + +Instance admins can take the following actions: + +- Edit the name and email of a user. +- Make the user staff: Making a user staff gives them admin access to the entire instance. This action makes the user a super admin in the Baserow instance. + + > Instance Admins have server-wide access to all users and all workspaces. They have the ability to revoke another Instance Admin's own staff permissions. The user that installs and sets up Baserow is automatically an Instance Admin and has staff privileges. + > +- Change the user account password. +- Impersonate a user. An Instance admin is unable to impersonate their own account. +- Deactivate or activate the user’s affiliation with your organization’s Enterprise license. When a user is marked as inactive they are prevented from signing in or signing up again using the email address. +- Delete a user. + +![enter image description here][1] + +## Make a user an Instance Admin + +Instance Admins have admin access to the entire self-hosted instance. To make a user an Instance admin, they must have access to the Baserow instance. + +Log in to your Baserow server as an Instance admin: + + 1. In the navigation sidebar on the left side of the page, click on the **Admin** tab. + 2. Click on the **Users** tab. + 3. Click on the ellipses (three-dot) icon to the right of the user you want to make the super admin. + 4. In the auth_user table, click the **Edit** button. + 5. Set the field called `is_staff` as true ☑︎ for a user. + +To remove a user as an Instance admin, set the field as false ☐. + +![Baserow INSTANCE ADMIN][2] + +> Note that making the user staff gives them admin access to all users, all workspaces, and the ability to revoke your own staff permissions. + +## Search and sort the list of members + +Use the search bar to find vital information quickly. + +Instance Admins can do a user search by name or email to narrow their search to a single person or to include more users. An Instance admin could, for instance, look for all users whose email addresses include a specific domain name. As you search, the number of search results will show up in the search bar. + +![enter image description here][3] + +By clicking on any of the column names in the Members page's header, you can sort the results of the member's query. + +- **Name** - Alphabetically (▴) or reverse alphabetically (▾) sort users' names. +- **Username** - Alphabetically (▴) or reverse alphabetically (▾) sort users' email addresses. +- **Last login** - Most recent (▴) or oldest login date (▾). +- **Signed up** - Most recently joined (▴) or oldest joined date (▾). +- Active - Show Active first (▴) or show deactivated users first (▾). + +![enter image description here][4] + +## Permanently delete a user + +A user account can be deleted from the User page in the Admin Panel. + +Instance Admins can permanently delete a user by clicking the ellipses (three-dot) icon to the right of the page. By clicking this button, options for that user will appear. + +After clicking the “Permanently delete” button, a pop-over will display asking you to confirm that you would like to delete the user. + +![enter image description here][5] + +## FAQs + +### What happens when a user is deleted? + +When a user is deleted from the User page of the Admin panel, the account is permanently deleted and cannot be recovered. The [default grace delay period](/user-docs/admin-panel-settings#user-deletion-grace-delay) does not apply. + +### What happens to a user's workspace when they are deleted? + +When a user is deleted, the workspaces that the user is a member of will continue to exist. The workspace will not be deleted, even if the deleted user is the last member in the workspace. However, deleting the last user in a workspace will prevent anyone from accessing that workspace. + +### Can a deleted user sign up using the same email address? + +After deleting a user, it's possible for a new user to sign up using the same email address. To prevent this, it's recommended to deactivate the user instead of deleting them. This ensures that the deleted user cannot sign up again using their previous email address. + +### What is the difference between deleting a user and revoking workspace access? + +It's important to understand the differences between [removing users from a workspace][6], table, or database and permanently deleting a user account from a self-hosted instance. + +In the SaaS hosted and self-hosted versions, admins can remove a member from a workspace, table, or database. Removing a user from a workspace, table, or database means their access to that specific application is revoked, but their account remains unaffected. + +In the self-hosted version, Instance Admins have the ability to permanently delete a user from the entire self-hosted instance. This means that when a user is deleted from the User page in the Admin panel, their account is permanently removed and cannot be recovered. + +## Related content + + - [Enterprise admin panel][7]. + - [Admin panel - Workspaces][7]. + - [Admin panel - Audit logs][8]. + - [Admin panel - Settings][9]. + - [Activate Enterprise license][10]. + +--- + + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we’re ready to assist you. + +   [Ask the Baserow community](https://community.baserow.io) + +   [Contact support](/contact) for questions about Baserow or help with your account. + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/680319a2-dedf-4aea-a9b2-6af47bd721f5/Screenshot_2023-01-05_at_18.18.39.png + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/e831ef8a-37a3-400c-b4f3-a71faf60fbe4/Screenshot%202023-09-29%20at%2014.27.52.png + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/fc5b0cf1-d490-42f3-b236-1e1e288af642/Screenshot_2023-01-05_at_17.56.45.png + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/f5fe322f-5823-4615-815a-5f31ec431ca5/Screenshot_2023-01-05_at_18.12.16.png + [5]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/9fae1986-b187-4f1a-acc9-f8e1ba2667bd/Screenshot_2023-01-06_at_10.36.52.png + [6]: /user-docs/remove-a-user-from-a-workspace + [7]: /user-docs/admin-panel-workspaces + [8]: /user-docs/admin-panel-audit-logs + [9]: /user-docs/admin-panel-settings + [10]: /user-docs/activate-enterprise-license",,baserow_user_docs,https://baserow.io/user-docs/admin-panel-users +119,Admin panel - Workspaces,admin-panel-workspaces,Manage Baserow workspaces in the admin panel,"# Baserow admin panel: Workspaces + +Instance admins can manage and view data about the workspaces connected to their organization on the Workspaces tab of the Admin Panel. [Learn more about creating a workspace in this support article.](/user-docs/setting-up-a-workspace) + +> Instance-wide Admin panel is an Enterprise-level feature. [Refer to this support article](/user-docs/enterprise-license-overview) to learn more about our Enterprise plan and the additional features it provides. +> + +Only Instance administrators have access to the Baserow Admin panel. Instance Admins have admin access to the entire self-hosted instance. + +The information and options on the Workspaces home page allow Instance admins to: + +- View all the current workspaces that exist within the organization +- Search for a particular workspace +- See the members in a workspace. The ability to add users to a workspace exists on the Members page of the workspace. Learn how to [invite members to a workspace](/user-docs/assign-roles-to-members-at-workspace-level#invite-members-to-a-workspace). +- View the number of applications in each workspace +- View the date that the workspace was created +- Delete the workspace + +![enter image description here][1] + +## Searching and sorting + +From the Workspaces home page, Instance admins can search for workspaces by their workspace name. Additionally, workspaces can be sorted by: + +- **Workspace name** - Alphabetically (▾) or reverse-alphabetical order (▴) +- **Applications** - Least number of applications (▾) or most (▴) +- **Date created** - Oldest created workspaces (▾) or most recently created (▴) + +To sort, click the header column that you would like to sort by: + +![enter image description here][2] + +## Delete a workspace + +Instance Admins can permanently delete a workspace by clicking the ellipses (three-dot) icon to the right of the page. By clicking this button, an option for deleting that workspace will appear. + +After clicking the “Permanently delete” button, a pop-over will display asking you to confirm that you would like to delete the workspace. + +![enter image description here][3] + + +--- + + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we’re ready to assist you. + +   [Ask the Baserow community](https://community.baserow.io) + +   [Contact support](/contact) for questions about Baserow or help with your account. + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/18a84303-e8b8-4ee0-a642-54d9915c158b/Screenshot_2023-01-05_at_18.42.45.png + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/76b3eee4-c7d8-4f8a-b3e0-1521eda0b2dc/Screenshot_2023-01-05_at_18.35.28.png + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/afa04bbb-63f4-4d6a-8c8e-06ba15368da9/Screenshot_2023-01-05_at_18.49.14.png",,baserow_user_docs,https://baserow.io/user-docs/admin-panel-workspaces +120,Audit logs,admin-panel-audit-logs,Baserow: View audit logs,"# Audit log + +Audit logs track every action performed in your Baserow workspaces, providing complete visibility into who did what, when, and from where. + +This guide covers how to track user activity, filter events, and export audit logs to monitor security, compliance, and workspace changes in Baserow. + +## What are audit logs? + +Audit logs record every action performed in Baserow with details about who, what, when, and where. Each log entry captures the user, action type, affected workspace or database, timestamp, and IP address. This comprehensive activity tracking enables security monitoring, compliance auditing, and troubleshooting. + +**Audit logs track:** +- Data changes (create, update, delete rows) +- Structural changes (add/remove tables, fields, views) +- Permission changes (role assignments, team updates) +- Workspace operations (create, delete, move databases) +- User actions (login attempts, account changes) +- Administrative actions (snapshot operations, installations) + +> **Advanced and Enterprise feature:** Audit logs are available on [Cloud Advanced plans](https://baserow.io/pricing) (workspace-level) and self-hosted Advanced/Enterprise plans (instance-level or workspace-level). + +Learn more: [Enterprise license overview](/user-docs/enterprise-license-overview) + +![Audit log interface in admin panel][1] + +## Audit logs types + +Baserow offers audit logs at two levels depending on your plan and needs: + +| Type | Who can access | Where to find | Scope | Available on | +|------|---------------|---------------|-------|--------------| +| **Workspace-level** | Workspace admins | Workspace sidebar → Settings → Audit log | Single workspace only | Cloud Advanced, Self-hosted Advanced/Enterprise | +| **Instance-level** | Instance admins | Profile → Admin panel → Audit log | All workspaces | Self-hosted Advanced/Enterprise only | + +### Audit log access levels + +Audit log availability and scope vary by plan and deployment type: + +| Plan type | Deployment | Scope | Access | +|-----------|------------|-------|--------| +| **Cloud Advanced** | Cloud | Workspace-level | Workspace admins | +| **Self-hosted Advanced** | Self-hosted | Instance-wide OR workspace-level | Instance admins OR workspace admins | +| **Self-hosted Enterprise** | Self-hosted | Instance-wide OR workspace-level | Instance admins OR workspace admins | + +### Instance-level vs workspace-level + +**Instance-level audit logs** (self-hosted only): + - Track all activity across the entire Baserow instance + - Include all workspaces, databases, and users + - Accessible only to instance administrators + - Available in the [admin panel](/user-docs/enterprise-admin-panel) + - Useful for system administrators monitoring security across all workspaces + +**Workspace-level audit logs** (cloud Advanced and self-hosted): + - Track activity within a specific workspace only + - Include only that workspace's databases, tables, and members + - Accessible to workspace administrators + - Available in [workspace settings](/user-docs/manage-workspace-permissions#workspace-level-audit-log) + - Useful for team leads monitoring their workspace activity + +## Workspace-level audit logs + +**Choose workspace-level when:** You're a workspace admin monitoring your team, you only need visibility into one workspace, or you're on the Cloud Advanced plan. + + 1. Open the workspace you want to audit + 2. Click **Audit log** in the workspace sidebar + 3. The audit log displays all events in this workspace + +## Access instance-level audit logs + +Instance administrators access audit logs through the admin panel (self-hosted installations only). **Choose instance-level when:** You're an instance admin on self-hosted, you need to monitor across all workspaces, or you're investigating cross-workspace issues. + +1. Log in as an **instance administrator** +2. Click your **workspace dropdown** in the top-right corner +3. Select **Admin tools** from the dropdown +4. Click **Audit log** in the admin panel sidebar + +The audit log page displays all tracked events. Instance administrators have admin access to the entire self-hosted Baserow instance, including all workspaces, databases, and user accounts. + +### Log retention + +**[Activity log events][2] are retained for 365 days.** After this period, logs are automatically deleted and cannot be recovered. Export logs regularly if you need longer retention for compliance or archival purposes. + +## Filter audit logs + +Narrow audit log results to find specific events or investigate particular activities. + +### Available filters + + - **User filter:** Filter by specific user email address. See all actions by a particular team member. Useful for investigating individual user behavior + - **Workspace filter:** Filter by specific workspace name. See all activity within a workspace. Useful for workspace-specific audits. **This is only available for instance-level audit logs.** + - **Event type filter:** Filter by action type (create, update, delete, etc.). Focus on specific operation categories. Useful for tracking particular changes + - **Date range filter:** Filter by timestamp (from/to dates). Narrow to specific time periods. Useful for incident investigation or compliance reporting + +### Apply filters + +1. Open the **Audit log** page in the admin panel +2. Locate filter controls above the log table +3. Select filter criteria: Choose user, workspace, event type from dropdowns, and set date range with calendar pickers +4. Results update automatically as you apply filters +5. Combine multiple filters for precise results + +Clear filters to return to full log view. + +## Sort audit logs + +Organize log entries by different columns to find events efficiently. + +Click any column header to sort by that column. Click the same column header again to reverse the sort direction. Sort indicators (▾ ▴) show the current sort column and direction. + +![Sorting audit logs by column](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/25329209-468d-4af0-8efd-bba89cc7d972/Screenshot_2023-01-17_at_09.56.13.png) + +## Export audit logs + +Download audit logs as CSV files for long-term storage, compliance reporting, or analysis in external tools. + +### Export process + + 1. Open the **Audit log** page in the admin panel. Optionally **apply filters** to limit export scope. + 2. Click **Export to CSV** button + 3. Click the **Export** button. A modal shows: Export request status, Timestamp of most recent request, and Download link when ready + 4. Click **Download** when the CSV is ready + 5. Save the CSV file to your local system + +![Exporting audit logs to CSV](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/2f907c2f-a1f4-4f9b-88c6-2b755ce317ce/d78c8c46d16781ca57ab644abdd01601f62b0e55.webp) + +### CSV file contents + +Exported CSV files include these columns: +- **User Email** - Who performed the action +- **User ID** - Numeric user identifier +- **Workspace Name** - Affected workspace (Instance-level audit logs) +- **Workspace ID** - Numeric workspace identifier (Instance-level audit logs) +- **Action Type** - Type of operation performed +- **Description** - Detailed action description +- **Timestamp** - When the action occurred (date and time) +- **IP Address** - Origin IP address of the request + +> **Import exported logs into Baserow:** [Import CSV files](/user-docs/import-data-into-an-existing-table) into Baserow tables for analysis using filters, sorts, and formulas. + +## What's tracked in audit logs + +Audit logs capture a comprehensive range of actions across your Baserow instance: + +### Data operations +- Create, update, delete, move rows +- Bulk row operations (create, delete, import, update multiple rows) +- Field value changes in cells + +### Database structure +- Create, delete, duplicate, reorder, update fields +- Create, delete, duplicate, reorder, update tables +- Create, delete, duplicate, reorder, update applications (databases) + +### Views and filters +- Create, delete, duplicate, reorder, update views +- Create, update, delete view filters +- Create, update, delete view sorts +- Update view field options and configurations + +### Workspaces (Instance-level audit logs) +- Create, delete, reorder, update workspaces +- Move databases between workspaces +- Workspace settings changes + +### Permissions and teams +- Create, delete, update teams +- Assign roles to users or teams +- Create, delete team subjects +- Permission level changes + +### Snapshots and backups +- Create, delete, restore snapshots +- Snapshot operation timing + +### Users +- Create, update user accounts +- Schedule user deletion +- Cancel user deletion +- User login events (if configured) + +### Administrative actions + - Install templates + - Update decorations (workspace themes) + - View slug URL updates + - License management operations + +## Frequently asked questions + +### Who can access instance-level audit logs? + +Only instance administrators can access instance-level audit logs in the admin panel. Workspace administrators can access [workspace-level audit logs](/user-docs/manage-workspace-permissions#workspace-level-audit-log) for their own workspaces but not instance-wide logs. + +### Can I access audit logs on Cloud plans? + +Cloud Advanced plans have workspace-level audit logs accessible to workspace administrators through workspace settings. Instance-level audit logs (covering all workspaces) are only available on self-hosted installations. + +### Can I extend audit log retention beyond 365 days? + +Not within Baserow directly. Export audit logs to CSV on a regular basis (monthly or quarterly) and store them in external systems to maintain longer historical records. Many organizations use automated scripts to export logs periodically for long-term archival. + +### Can I filter logs by IP address? + +Currently, you can sort by IP address but not filter directly by it. To find logs from a specific IP, export the CSV and filter it in Excel/Sheets, or import it into a Baserow table where you can apply IP address filters. + +### What's the difference between workspace and instance audit logs? + +**Workspace-level** shows activity within one workspace only. Available to workspace administrators on Cloud Advanced and self-hosted Advanced/Enterprise plans. Access through the workspace sidebar. + +**Instance-level** shows activity across all workspaces on a self-hosted instance. Available only to instance administrators on self-hosted Advanced/Enterprise plans. Access through the admin panel. + +Both track the same types of events and offer the same filtering, sorting, and export capabilities. The only functional difference is the workspace filter dropdown (present in instance-level, not needed in workspace-level). + +### Do audit logs affect system performance? + +Audit logging has minimal performance impact on modern systems. Baserow logs events asynchronously without blocking user operations. Very high-volume instances (thousands of actions per second) should monitor database size and performance. + +### Can regular users see audit logs? + +No. Only instance administrators see instance-level logs. Workspace administrators see workspace-level logs for their workspaces only. Regular workspace members (builders, editors, commenters, viewers) cannot access audit logs. + + +## Related resources + +### Audit and monitoring +- [Workspace-level audit logs](/user-docs/manage-workspace-permissions#workspace-level-audit-log) - Track workspace activity +- [Row change history](/user-docs/row-change-history) - Track individual row modifications +- [Notifications](/user-docs/notifications) - Get alerts for workspace changes + +### Admin panel features +- [Enterprise admin panel](/user-docs/enterprise-admin-panel) - Admin panel overview +- [Admin panel - Users](/user-docs/admin-panel-users) - Manage users +- [Admin panel - Workspaces](/user-docs/admin-panel-workspaces) - Manage workspaces +- [Admin panel - Settings](/user-docs/admin-panel-settings) - Instance configuration + +### Security and compliance +- [Permissions overview](/user-docs/permissions-overview) - Role-based access control +- [Single Sign-On (SSO)](/user-docs/single-sign-on-sso-overview) - Enterprise authentication +- [Enterprise license](/user-docs/enterprise-license-overview) - Enterprise features + +### Data management +- [Import data](/user-docs/import-data-into-an-existing-table) - Import exported audit logs +- [Export tables](/user-docs/export-tables) - Export data for analysis +- [Webhooks](/user-docs/webhooks) - Automate responses to events + +### Plans and features +- [Pricing plans](/user-docs/pricing-plans) - Feature availability by plan + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/52a27909-ccd0-42ac-8590-dfd403664a84/Admin%20settings%20-%20audit%20log.jpg + [2]: https://baserow.io/docs/installation%2Fconfiguration#backend-misc-configuration",,baserow_user_docs,https://baserow.io/user-docs/admin-panel-audit-logs +121,Admin panel - Settings,admin-panel-settings,Baserow admin panel settings for instance control,"# Baserow instance settings in the admin panel + +Instance Admins can control two fundamental aspects of their organization's Baserow account on the Settings page of the Admin Panel: account restrictions and user deletion. + +> Instance-wide Admin panel is an Enterprise-level feature. [Refer to this support article](/user-docs/enterprise-license-overview) to learn more about our Enterprise plan and the additional features it provides. +> + +Instance Admins have admin access to the entire self-hosted instance. The controls in this section help to manage your organization's security protocols. Note that the first user to create an account in a new self-hosted instance will be the admin user for that instance. + +## Overview + +The admin settings can be found by clicking on the workspace selection menu. + +Click on the Settings option in the Admin Panel's navigation sidebar to navigate to the **Settings** page. This will bring up a page with settings options. + +When **Verify import signature** is enabled, the signature of the imported data is verified to ensure the data has not been tampered with. + +![enter image description here][1] + +## Account restrictions + +The “Account restrictions” section allows Instance admins to control who can gain access to your organization. This setting can be adjusted by clicking the toggle to enable or disable. + +### Allow creating new accounts + +By default, any user visiting your Baserow domain can sign up for a new account. This setting allows Instance admins to prevent users from inviting non-users to sign up for a new account. + +After [setting up a self-hosted Baserow instance](/docs/index#installation), It may be important to restrict premium access or allow non-members to view the data for a licensed workspace. You can disable the ability to sign up for a new account on the self-hosted instance URL. + +To disable sign-up on self-hosted Baserow instance: Admin → Settings → Allow creating new accounts → Toggle off. + +### Allow signups via workspace invitations + +If you toggle off the **Allow creating new accounts** option, the “Allow signups via workspace invitations” option will appear. Instance Admins can use this setting to prevent or allow users to invite other users from outside your Enterprise domain. + +Toggling this option on means that only directly invited users can create an account, so only members with workspace admin roles can invite users. For instructions on how to invite users to a workspace, [see this support article](/user-docs/manage-workspace-permissions). + +> Note that even if the creation of new accounts is disabled, this option permits directly invited users to still create an account. +> + +![enter image description here][2] + +### Allow resetting password + +By default, users can reset their passwords. The last option in the Account restrictions section allows Instance admins to restrict users from requesting a password reset link. + +> Please keep in mind that if you disable this option, you risk locking yourself out of the system and losing access to your account if you forget your password. +> + +![enter image description here][3] + +### Allow everyone to create new workspaces + +With this setting enabled, new users will have a workspace automatically created for them where they are Workspace Admins. For billing purposes, they will be reported as Admin. Learn more about [Who is considered a “user” for billing purposes](/user-docs/subscriptions-overview#who-is-considered-a-user-for-billing-purposes) in this support article. + +To prevent this, disable this setting. This will only allow staff to create new workspaces. Newly invited users will only start with the role they were invited with. + +![enter image description here][4] + +## Email verification + +Email verification is a security measure that confirms the legitimacy of email addresses associated with Baserow accounts. This helps to prevent unauthorized access and ensures you're collaborating with the intended users. + +![Email verification][5] + +### Email verification levels + +Baserow offers three email verification levels, allowing you to customize the verification requirement for your [collaborators][6]: + + - **No verification**: Users can begin using Baserow immediately upon registration, without needing to verify their email address. This option offers the quickest onboarding experience but provides the least security. It's suitable for low-risk workspaces with a high level of trust among collaborators. + - **Recommended verification**: This option encourages users to verify their email address but doesn't make it mandatory for initial use. + - **Enforced verification**: Upon registration, a verification link is sent to the user's email address. Verifying this email is essential to start using Baserow. This option prioritizes security and ensures all collaborators have valid email addresses. It's ideal for workspaces handling sensitive information. + +### Configure email verification + +Only Baserow instance admins can modify the email verification setting. Here's how to configure it: + + 1. Navigate to the [Admin Panel][7] → Settings. + 2. Scroll down to the User section → Email Verification setting. + 3. Choose your preferred verification level from the available options. + +Once configured, the chosen verification level will apply to all new user registrations within your Baserow instance. + +## User deletion grace delay + +When you delete an account in Baserow, that account will remain on Baserow for a retention period before it's permanently deleted. + +The default grace delay period is 30 days. Instance Admins can adjust this period in the User deletion section. + +Grace delay is the number of days without a login after which an account scheduled for deletion is permanently deleted. + +> Note that the default grace delay period only applies when an [account is scheduled for deletion from the user’s account settings](/user-docs/delete-your-baserow-account). It does not apply when the [user is permanently deleted from the User page of the Admin panel](/user-docs/admin-panel-users#permanently-delete-a-user). +> + +![enter image description here][8] + +## Track workspace usage (Maintenance) + +This enables a nightly job that automatically tracks workspace usage. The job calculates the total number of rows and files used within each workspace. This data is then displayed on the premium workspace admin page, providing insights into workspace activity. + +If enabled, usage data is displayed on the premium workspace admin page. + +If not enabled, no workspace usage data is collected or displayed on the admin page. + +## Co-branding for enterprises + +Baserow provides a co-branding option for Enterprise plan users. This feature allows you to upload your logo and tailor Baserow's appearance to align with your company's brand. + +### What gets branded? + +Your logo will be displayed prominently across various locations, for example: + + - Email header: Emails sent from Baserow will feature your logo at the top, reinforcing your brand identity in every communication. + - Sidebar: Your logo will be displayed in the bottom left corner of the Baserow sidebar, providing continuous brand visibility. + - Publicly shared views: When you [share a Baserow view publicly][9], your logo will be displayed, ensuring your brand recognition even outside your organization. + - Publicly shared forms: Similar to publicly shared views, your logo will be incorporated into any forms you make public. + +and other locations where the logo is displayed. + +![Enterprise co-branding in Baserow][10] + +To upload a custom logo: + + 1. Navigate to the Admin Panel: Click on the Admin → Settings. + 2. Access branding options: On the Admin Settings page, scroll down to the ""Branding"" section. + 3. Upload your logo: Locate the Logo category within the branding section. Here, you can upload your desired company logo to replace the Baserow logo with your custom alternative. + +--- + + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account. + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/e27b5db3-a72a-4383-831a-95d504c16e05/Screenshot_2023-01-06_at_09.19.22.png + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/04da95b5-d442-4a60-ba5e-8e14bd0b36af/Screenshot_2023-01-06_at_09.28.34.png + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/2127c0f1-1a7b-4f2d-9497-0e19768f8487/Screenshot_2023-01-06_at_09.38.31.png + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/d6c4767e-a290-490a-aeb0-0cd13b0831d4/Screenshot_2023-01-13_at_09.33.10.png + [5]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/257926a7-b4d7-499e-bfd4-8d30fce31e4c/Email%20verification.png + [6]: /user-docs/managing-workspace-collaborators + [7]: /user-docs/enterprise-admin-panel + [8]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/7afc9b19-28d7-46b5-883c-6ad211fcc956/Screenshot_2023-01-06_at_10.29.58.png + [9]: /user-docs/public-sharing + [10]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/9cebfa8b-046f-4ea0-b784-9b2f433e3bf9/Co-branding%20for%20enterprises.png",,baserow_user_docs,https://baserow.io/user-docs/admin-panel-settings +122,Enterprise admin panel,enterprise-admin-panel,Baserow Enterprise admin panel overview,"# Baserow Enterprise admin panel + +The Admin Panel is a centralised interface for Instance admins to manage the Enterprise account for their organization. + +Instance admins can actively maintain authentication and manage user and workspace access using a variety of tools in the Admin Panel. Only Instance administrators have access to the Baserow Admin panel. An Instance Admin is the account that installs and sets up Baserow and has staff privileges. + +This support article will help Instance admins understand and manage Baserow's use in their organisation. + +> This is an Enterprise-only feature. If you are interested in learning more about our Enterprise plan and the additional features that it offers, then [visit this page][1]. +> + +## Overview of the Admin Panel + +Instance admins have access to a high-level of the functions from the Admin Panel. In general, you can: + +- Delete or deactivate users and workspaces associated with their Enterprise account +- View user activity and other data point reports. +- Set account restrictions and authentication settings for their organisation +- View an organization's complete list of licenses. + +## Navigating to the Admin Panel + +Before proceeding, make sure you have the ""Staff"" access required to access the Admin Panel. + +Login to your Baserow server as an Instance admin. In the navigation sidebar on the left side of the page, Instance admins will see the “Admin” option. This will take you to the Dashboard page. + +![enter image description here][2] + +## Admin Panel pages + +To manage and view information about usage and access from the Admin Panel, click 'Admin' in the sidebar to view pages with important data. Learn how to use the information and options on these pages. + +- **Dashboard**: This information is useful when you need to delve into data and uncover valuable insights. + + The Admin panel's Dashboard page displays data about workspaces, applications, users, user activity, and more. Instance Admins can view everything from information about the total number of users, workspaces and applications associated with the organization’s Enterprise plan, to more specifics about new and active users. + + ![enter image description here][3] + +- **[Users][4]**: The Users page of the Admin Panel lets Instance admins manage and view information about Baserow users from the organization. +- **[Workspaces][5]**: Instance admins can manage and view data about the workspaces connected to their organization on the Workspaces tab of the Admin Panel. +- **[Authentication][6]**: Baserow Single Sign On (SSO) allows Instance admins to have control over user authentication. To learn more about configuring your organization’s SSO settings, please [refer to this support article](https://baserow.io/user-docs/single-sign-on-sso-overview). +- **[Audit Logs][7]**: The audit log keeps track of every action performed in your Baserow instance. You can have complete visibility into what you and your collaborators have been working on. +- **[Settings][8]**: Instance Admins can control two fundamental aspects of their organization’s Baserow account on the Settings page of the Admin Panel: account restrictions and user deletion. +- **[Licenses][9]**: The Admin Panel enables Instance admins to create access rules and keep an overview of every user license in the company. + + +--- + + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we’re ready to assist you. + +   [Ask the Baserow community](https://community.baserow.io) + +   [Contact support](https://baserow.io/contact) for questions about Baserow or help with your account. + + [1]: /user-docs/enterprise-license-overview + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/e474c2cf-7e77-4abf-82d1-f444deb57b36/Screenshot_2023-01-05_at_16.16.33.png + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/c1124a18-d686-48af-8755-6166dad58588/Screenshot_2023-01-19_at_18.04.37.png + [4]: /user-docs/admin-panel-users + [5]: /user-docs/admin-panel-workspaces + [6]: /user-docs/single-sign-on-sso-overview + [7]: /user-docs/admin-panel-audit-logs + [8]: /user-docs/admin-panel-settings + [9]: /user-docs/get-a-licence-key",,baserow_user_docs,https://baserow.io/user-docs/enterprise-admin-panel +123,Activate Enterprise license,activate-enterprise-license,Activate Enterprise license in Baserow self-hosted,"# Activate Enterprise license in self-hosted plan + +This section will walk you through activating the [Enterprise version](/user-docs/enterprise-license-overview) on your self-hosted Baserow server for Baserow versions 1.14.0 and greater. + +## Steps to Activate Enterprise + +### 1. Contact Sales + +Upgrading to the Enterprise plan is a manual process handled by the Baserow sales team. Please first [contact a sales representative](/contact-sales) to get started with the Enterprise plan. + +### 2. Setup or Upgrade a Baserow Server + +Baserow’s Enterprise version is only available for self-hosted Baserow servers **on Baserow version 1.14.0 or greater**. It is not available for workspaces on [Baserow.io](http://Baserow.io) itself. + +- See our [installation documentation](/docs/installation%2Finstall-with-docker) for options for setting up a self-hosted Baserow server if you don’t already have one. +- If you already have a Baserow server ensure it is already upgraded and running on **Baserow version 1.14.0 or greater**. You can verify you are on 1.14.0 by expanding the Admin section in the sidebar of Baserow and verifying you can see a greyed-out or active “Audit Log” button. + +### 3. Find your Instance ID + +For the Baserow server that you want to activate enterprise on, you will need to provide your sales representative with the server's Instance ID. To find your Instance ID: + +1. Log in to your Baserow server as an Instance Admin. Instance Admins have staff access to the entire self-hosted instance. The first user who signed up is automatically an Instance Admin. +2. Expand the Admin section at the top of the left sidebar. +3. Open the Licenses page in the Admin section. +4. Copy your Baserow servers Instance ID. + +![enter image description here][1] + +### 4. Install your Enterprise license key + +Next, you should send the server's instance ID to your sales representative, who will then send you back an Enterprise License key. Once you have your Enterprise License key, you can install it into your server by: + +1. Go to the Licenses admin page where you got your Instance ID above. +2. If you have any old expired licenses, click on each one and select **Disconnect License** and remove them permanently. + + If you had previously activated your enterprise license in 1.12.X or earlier it will be showing up as expired after upgrading to 1.14.0. You must also disconnect and re-register this license. +3. On the Licenses admin page click **Register License** and enter your new Enterprise license key. +4. Your Enterprise license will immediately become active for every single user of your Baserow server. There is no need to assign individual seats to users as the Enterprise license is global. + +![enter image description here][2] + +## Updating an Existing License + +If you have already registered a Baserow Enterprise or Premium license in your self-hosted server, Baserow will automatically attempt to fetch any changes to your license every hour if it can access the internet. + +> If an enterprise license was activated in Baserow versions 1.12.X or older it will show as expired after upgrading to 1.14.0. You should disconnect the license and re-install it after upgrading to fix this issue. + +Changes to licenses are made by the Baserow sales team. For example, these changes could be: + +- An upgrade of the type of your existing license from Premium to Enterprise, or +- An updated expiry date. + +You can also manually trigger this update by clicking the **Check Now** button on your Licenses detail page. + +![enter image description here][3] + +### Update a license on a server without internet + +This section will cover how to update a license on a server that can’t reach the internet. + +If your Baserow server is on an air-gapped network or behind a firewall that prevents it from requesting updated license details every hour, then automatic changes made by the Baserow sales team to your license will not be picked up. + +To get updates you should: + +1. Inform the Baserow sales team that your Baserow server cannot access the internet and so you need to get manual license updates. +2. When the Baserow sales team, as discussed with you, makes any changes to your license they will send you a new license key. +3. You should take this new license key and register it in your Baserow server following the steps in the **[Install your Enterprise license key][4]** section above. +4. Once your new updated license has been entered, click on your old License on the Licenses Admin page and click the “Disconnect License” to remove the old version. + + > After disconnecting an old enterprise license you might see your feature badge in the top left of Baserow change to become `Premium`. This is a known bug in 1.14.0 and simply refreshing the page will re-enable your enterprise features for your user. + > + +## Troubleshooting + +### How can I tell if Enterprise is active? + +Look for the `Enterprise` badge in the top left corner of Baserow. If the badge is present, then your Enterprise plan is active. + +![enter image description here][5] + +### How do I check if I am using the right version of Baserow? + +Open the Admin menu in the sidebar and check to see if you can see the **Audit Log** button. If it is present (even if greyed out) you are on 1.14.0 or greater and can activate the enterprise license. If you cannot see the **Audit Log** admin page then you first must upgrade your Baserow version to 1.14.0 or greater to use Enterprise. + +Refer to our documentation for a guide on how to [upgrade from a previous version](/docs/installation%2Finstall-with-docker#upgrading-from-a-previous-version). + +![enter image description here][6] + +### How can I allocate users’ seats? + +The enterprise license grants every current and future user on your instance the enterprise features. You do not need to allocate seats to individual users on the Enterprise license as they will automatically get the features. + +### I don’t have the enterprise features after registering the license + +Make sure you are using Baserow 1.14.0, older versions will not work with the enterprise version. Refer to our documentation for a guide on how to [upgrade from a previous version](/docs/installation%2Finstall-with-docker#upgrading-from-a-previous-version). + +Otherwise, try logging out of Baserow and back in again. + +### I upgraded to 1.14.0 and my enterprise license now shows as expired + +If an enterprise license was activated in Baserow version 1.12.X or prior, it will show as expired after upgrading to 1.14.0. To resolve this issue, disconnect and reinstall the licence after upgrading to 1.14.0. + + +--- + + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we’re ready to assist you. + +   [Ask the Baserow community](https://community.baserow.io) + +   [Contact support](https://baserow.io/contact) for questions about Baserow or help with your account. + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/efd0ac6e-04ef-4235-b85b-bdf3a89f5aba/Untitled.png + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/a06a7ac8-5a32-47f9-9d31-af855948b3fa/Untitled%201.png + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/688840c3-36d6-4e98-83a3-ec909cdb204b/Untitled%202.png + [4]: #4-install-your-enterprise-license-key + [5]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/85c603bf-aa65-4a83-9272-fee8cc33169a/Untitled%203.png + [6]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/25b614b6-9caa-4a74-806d-53efe203b8d6/Untitled%204.png",,baserow_user_docs,https://baserow.io/user-docs/activate-enterprise-license +124,Configure SSO with Azure AD,configure-sso-with-azure-ad,Baserow: Configure single sign-on with Azure AD,"# Configure Single Sign-on (SSO) with Azure AD + +This guide is intended for [Admins](/user-docs/working-with-collaborators#set-the-permission-level-for-collaborators) setting up SSO SAML with Azure AD. + +When you configure Single Sign-on (SSO) with Azure AD, your users will be able to create and sign into their Baserow accounts using Azure AD. + +If you are looking for information on setting up SSO with other providers: + +- [Configure OneLogin for SAML SSO](/user-docs/configure-sso-with-onelogin) +- [Configure Okta for SAML SSO](/user-docs/configure-sso-with-okta) +- [Configure Facebook for OAuth 2 SSO](/user-docs/configure-facebook-for-oauth-2-sso) +- [Configure GitHub for OAuth 2 SSO](/user-docs/configure-github-for-oauth-2-sso) +- [Configure GitLab for OAuth 2 SSO](/user-docs/configure-gitlab-for-oauth-2-sso) +- [Configure Google for OAuth 2 SSO](/user-docs/configure-google-for-oauth-2-sso) +- [Configure OpenID Connect for OAuth 2 SSO](/user-docs/configure-openid-connect-for-oauth-2-sso) + +> Instance-wide admin panel, SSO, Payment by invoice, Signup rules, and Audit logs are features only available for Baserow paid plans. [Get in touch with us here](/contact-sales) if you're interested in learning more about paid pricing. +> + +Here's how to set up Azure AD to sign in to your Baserow account. + +## Prerequisites + +To set up SSO SAML with Azure AD in Baserow, you need: + +- A Baserow user account. If you don't already have one, you can create an account. +- Instance admin access to the entire Baserow self-hosted instance. +- An Azure AD user account with Global Administrator, Cloud Application Administrator, or Application Administrator role. + +## Create an Azure application and set up SAML SSO + +1. To add an enterprise application to your Azure AD tenant, sign in to the [Azure Active Directory Admin Center](https://aad.portal.azure.com/). +2. In the Azure portal, select **Azure Active Directory > Enterprise applications** and select **New application**. Then click **+** **Create your own application**. +3. Enter the display name for your new application, select **Integrate any other application you don't find in the gallery**, and then select **Create** to add the application. + + ![Create an Azure application and set up SAML SSO][1] + +4. In the left menu of the app’s **Overview** page, select Single sign-on. +5. Select **SAML** as the single sign-on method. + + ![Select **SAML** as the single sign-on method.][2] + +6. The **Set Up Single Sign-On with SAML** page will then open. + +## Get your Baserow SSO URLs + +1. In a new tab, visit your Baserow server and log in as an instance-wide admin. +2. Open the **Admin** section in the Baserow sidebar. +3. Click the **Authentication** page. +4. Click the **Add Provider** button in the top right. +5. Select SSO SAML provider. +6. In the **Add a new SSO SAML provider** modal that has opened, copy the **Single Sign on URL.** + +![Add a new SSO SAML provider][3] + +## Configure SAML URLs in Azure + +1. Go back to Azure and the **Set Up Single Sign-On with SAML** page. +2. In the first section titled Basic SAML Configuration, click the **Edit** button. +3. Paste the **Single Sign on URL** you copied from **Baserow into the top three fields:** + 1. Identifier (Entity ID) + 2. Reply URL (Assertion Consumer Service URL) + 3. Sign on URL +4. Go back to Baserow and the previously opened **Add a new SSO SAML provider** modal and now copy the **Default Relay State URL.** +5. Go back to Azure and paste the **Default Relay State URL** from Baserow into the Relay State field in Azure. +6. Leave the Logout URL empty as Baserow does not yet support single sign out. +7. Finally, click **Save** in Azure, your end result should look something like the following screenshot: + + ![Configure SAML URLs in Azure][4] + +## Setup Azure Attributes & Claims + +1. Go to the second section in Azure titled Attributes & Claims, then click the **Edit** button +2. On the new Attributes & Claims page click **Add New Claim**. + 1. Type ‘user.email’ in the Name field + 2. In the Source attribute dropdown, select **user.mail** + 3. Click **Save** + + ![Setup Azure Attributes & Claims][5] + +3. Click Add New Claim again + 1. Type ‘user.first_name’ in the Name field + 2. Select **user.givenname** from the Source attribute dropdown. + 3. Click **Save** + + ![Add New Claim again][6] + +4. The end result of your Attributes & Claims page in Azure should now look something like this: + + ![Attributes & Claims page in Azure][7] + +5. Click the **X close** button in the top right of the Attributes & Claims page in Azure to get back to the **Set Up Single Sign-On with SAML** page. + +## Fix and install Azure SAML metadata in Baserow + +1. Next in the third section titled SAML Certificates next to Federation Metadata XML click **Download**. + + ![Fix and install Azure SAML metadata in Baserow +][8] + +2. Open the download XML file in a text editor. + 1. By default, Microsoft includes both SAML 2.0 and Web Services Federation configuration in this XML file. Baserow only supports SAML 2.0 and so you will now need to delete the redundant Web Services Federation configuration from this file, if you do not Baserow will not accept the metadata. + 2. To fix this open up the downloaded XML metadata file in a text editor. + 3. Edit the file by deleting the text starting from and including `` in the metadata file. + 1. For example, given the following example metadata file + + ```xml + ... + ``` + + 2. The end result should look like the below, without any RoleDescriptor sections. + + ```xml + + ``` + + 3. If you are having trouble with this step please ask for help by asking your Baserow sales rep. + 4. Copy the resulting metadata which has had the RoleDescriptor sections removed. +3. Go back to Baserow and the previously opened **Add a new SSO SAML provider** modal. Paste the contents of the edited file you just copied into the **metadata** box and click **Save**. + + ![Go back to Baserow and the previously opened][9] + +4. Go back to Azure and in the left sidebar click **User and workspaces**. +5. Click **Add user/workspace** and on the **Add Assignment** page that opens select all users and workspaces you wish to be able to login to your Baserow server, then click **Assign**. + +## Testing SSO In Baserow + +You should be able to log in with Azure AD after completing these steps by visiting your Baserow servers login page. Your users will now be taken to an Azure AD sign-in flow when they attempt to log into Baserow. After logging in with their Azure AD credentials, they will be redirected to the app. + +![Testing SSO In Baserow][10] + +## Understanding Baserow's authentication system + +By default, Baserow restricts users to logging in only with the same authentication method they used for signing up. For instance, if a user creates an account with a username and password, they won't be able to log in through SSO without further configuration. + +## Troubleshooting error for SSO Login + +You might encounter an error message — ""Something went wrong: please use the provider that you originally signed up with"" — when you attempt to log in via SSO. + +This error message indicates a conflict between your initial sign-up method and your attempt to log in via SSO after initially signing up for Baserow with a username and password. + +Here are the primary options to address this error: + +**Option 1: Enable multiple authentication methods** + +Set the environment variable `BASEROW_ALLOW_MULTIPLE_SSO_PROVIDERS_FOR_SAME_ACCOUNT=true`. After setting this variable, restart the Baserow instance. This allows users to log in with either a password or SSO. + +This option **increases security risk**, especially if you have multiple OAuth providers enabled. An attacker who gains access to a user's account on any external provider could potentially use that access to log in to the associated Baserow account. + +> For optimal security, we recommend maintaining consistent authentication methods unless necessary. If enabling multiple login methods is essential, implement additional security measures to mitigate potential risks. + +**Option 2: Maintain consistent authentication method** + +Users can continue logging in with the authentication method they signed up with. This avoids changing Baserow's default behavior and maintains existing security measures. + +**Option 3: Delete user from [Admin panel](/user-docs/enterprise-admin-panel) and re-login via SSO** + +You can delete the user from the Baserow [admin panel](/user-docs/enterprise-admin-panel). Upon logging in via SSO, Baserow will recreate the user, automatically setting SSO as their default authentication method. + +Deleting the user permanently removes all their associated data within Baserow. This option should only be considered if data loss is acceptable and after ensuring all data is backed up elsewhere. + +Always prioritize data security when modifying your authentication settings. + +## Related content + + - [Single Sign On (SSO) overview](/user-docs/single-sign-on-sso-overview). + - [Baserow Enterprise plan](/user-docs/enterprise-license-overview). + - [Enable SSO in the admin panel](/user-docs/enable-single-sign-on-sso). + - [Email and password authentication](/user-docs/email-and-password-authentication). + +--- + + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we’re ready to assist you. + +   [Ask the Baserow community](https://community.baserow.io) + +   [Contact support](https://baserow.io/contact) for questions about Baserow or help with your account. + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/14d7d65d-72c2-4887-9c07-41d6773a3836/Untitled.png + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/56dcc35d-684b-4ff7-8c53-bda9b5f7ba3e/Untitled%201.png + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/baf9a014-18f4-41d8-bb84-2717111897a8/Screenshot_2023-02-15_at_09.24.55.png + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/5813c58e-be81-46c2-aff4-f0bc46a607e6/Untitled%202.png + [5]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/0096eb01-2d16-46d7-bd06-4f18b222b2ee/Untitled%203.png + [6]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/ec4f0e04-78fa-4951-b726-c578b2cee2db/Untitled%204.png + [7]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/04021e51-ed84-45f8-8ef8-cae4c087f963/Untitled%205.png + [8]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/b02c2d10-777b-4910-a78d-9284b0ea393d/Screenshot_2023-02-15_at_09.56.47.png + [9]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/96130543-fccb-49d2-ab10-ed5daf41beaa/Untitled%206.png + [10]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/be33533b-090f-40a3-a9b0-19c7be3b187b/Screenshot_2022-11-04_at_07.02.25.png",,baserow_user_docs,https://baserow.io/user-docs/configure-sso-with-azure-ad +125,Keyboard shortcuts,baserow-keyboard-shortcuts,Baserow keyboard shortcuts for navigation,"# Keyboard shortcuts: Work faster in Baserow + +Master Baserow's keyboard shortcuts to navigate databases, edit data, and build applications faster. This reference guide covers shortcuts for Mac and Windows across Grid view, Application Builder, and general navigation. + +## Overview + +Keyboard shortcuts eliminate repetitive clicking and mouse movements, allowing you to focus on your data and workflows instead of navigating. Whether you're entering data in Grid view, building applications, or managing workspaces, these shortcuts help you work at the speed of thought. This guide organises shortcuts by task and platform, allowing you to quickly find what you need. + +## Utility shortcuts + +General shortcuts that work throughout Baserow. Start with these high-impact shortcuts that work across Baserow: + +| Shortcut (Mac) | Shortcut (Windows) | Action | +|----------------|-------------------|--------| +| `Cmd ⌘` `Z` | `Ctrl` `Z` | Undo your last action | +| `Cmd ⌘` `Shift ⇧` `Z` | `Ctrl` `Shift ⇧` `Z` | Redo an undone action | +| `Cmd ⌘` `P` | `Ctrl` `P` | Print current view or expanded record | +| `Cmd ⌘` `K` | `Ctrl` `K` | Open workspace-level search (""Jump to"") | + +## Grid view shortcuts + +### Navigation shortcuts + +Move quickly through your data in a Grid view without reaching for the mouse: + +| Shortcut (Mac) | Shortcut (Windows) | Action | +|----------------|--------------------|--------| +| `→` or `Tab` | `→` or `Tab` | Move right between elements or cells in a row | +| `←` or `Shift ⇧ Tab` | `←` or `Shift ⇧ Tab` | Move left between cells in a row | +| `↑` | `↑` | Move up between cells in a column | +| `↓` | `↓` | Move down between cells in a column | +| `Space bar` | `Space bar` | Open enlarged view of selected row | +| `Esc` | `Esc` | Close enlarged row view | + +### Data editing shortcuts + +Speed up data entry and editing in Grid view: + +| Shortcut (Mac) | Shortcut (Windows) | Action | +|----------------|--------------------|--------| +| `Cmd ⌘` `C` | `Ctrl` `C` | Copy selected cell or range of cells | +| `Cmd ⌘` `V` | `Ctrl` `V` | Paste content into selected cell(s) | +| `Enter` or `F2` | `Enter` or `F2` | Enter edit mode for selected cell | +| `Enter` (while editing) | `Enter` (while editing) | Save changes and exit edit mode | +| `Shift ⇧` `Enter` | `Shift ⇧` `Enter` | Insert a new row below the selected cell | +| `Esc` | `Esc` | Cancel editing or close modals | +| `Cmd ⌘` `Shift ⇧` `S` | `Ctrl` `Shift ⇧` `S` | Open search bar | + +### Field-specific Enter behavior + +The `Enter` key behaves differently depending on the field type: + +- **[File fields][1]**: Opens the file upload dialog +- **[Link to table fields][2]**: Opens the linked table selection window +- **[Boolean fields][3]**: Toggles checkbox on/off +- **Text fields**: Enters edit mode (press `Enter` again to save) + +### Selection shortcuts + +Work with multiple cells efficiently. Select a starting cell, hold `Shift`, then use arrow keys or click another cell to select a range. This works for copying, pasting, or bulk editing. + +| Shortcut (Mac) | Shortcut (Windows) | Action | +|----------------|--------------------|--------| +| `Shift ⇧` `Click` | `Shift ⇧` `Click` | Select range from first clicked cell to second clicked cell | +| `Shift ⇧` `↑` or `Shift ⇧` `↓` | `Shift ⇧` `↑` or `Shift ⇧` `↓` | Expand selection up or down | +| `Shift ⇧` `←` or `Shift ⇧` `→` | `Shift ⇧` `←` or `Shift ⇧` `→` | Expand selection left or right | + +## Application Builder shortcuts + +Navigate and build applications faster with these keyboard commands. These shortcuts work when you're in the Application Builder editor, not when previewing or using published applications. + +| Shortcut | Action | +|----------|--------| +| `Delete` or `Suppr` | [Delete the selected element][5] | +| `←` `→` `↑` `↓` | Select adjacent [elements][6] | +| `Ctrl` `←` `→` `↑` `↓` | Move the selected [element][6] in any direction | +| `P` | Select the [parent element][6] of current selection | +| `C` | Select the first child of the selected [container element][6] | + +## Create your workflow patterns + +Use shortcuts for repetitive tasks. Shortcuts provide the biggest time savings when you're entering data across many cells, navigating large tables, copying and pasting between views or tables, building and adjusting application layouts, or reviewing and editing multiple records. + +Combine shortcuts into sequences for common tasks: + +- **Quick data entry**: `Tab` (move right) → `Enter` (edit) → type → `Enter` (save) → `Tab` (next cell) +- **Bulk editing**: `Click` → `Shift ⇧` `Click` (select range) → `Cmd/Ctrl` `C` (copy) → navigate → `Cmd/Ctrl` `V` (paste) +- **Row review**: `Space` (expand row) → review → `Esc` (close) → `↓` (next row) → repeat + +> Don't try to memorize every shortcut at once. Start with the essential shortcuts and use them consistently for a week. Once they become automatic, add a few more to your repertoire. + +## Frequently asked questions + +### Do keyboard shortcuts work on all devices? + +Keyboard shortcuts work on desktop computers (Mac, Windows, Linux) with physical keyboards. Touchscreen devices (tablets, phones) rely on touch interactions instead, though you can use an external keyboard with supported shortcuts. + +### Can I customize keyboard shortcuts in Baserow? + +Baserow currently uses fixed keyboard shortcuts that cannot be customized. This ensures consistency across all users and simplifies documentation and support. + +### Why doesn't a shortcut work for me? + +Common reasons shortcuts fail: + +- **Wrong context**: Some shortcuts only work in specific views (e.g., Grid view shortcuts don't work in Gallery view) +- **Modal or dialog open**: Close any open modals first +- **Browser shortcuts conflict**: Your browser may intercept certain key combinations +- **Input focus**: Make sure you're not typing in a text field when using navigation shortcuts +- **Operating system differences**: Ensure you're using the correct modifier key (Cmd on Mac, Ctrl on Windows) + +### What's the difference between Cmd and Ctrl? + +`Cmd ⌘` is the Command key on Mac keyboards. `Ctrl` is the Control key on Windows and Linux keyboards. They serve the same function in Baserow shortcuts; use whichever matches your operating system. + +### Can I use shortcuts while editing a cell? + +Most navigation shortcuts are disabled while editing a cell to prevent conflicts with text editing. Press `Enter` to save changes or `Esc` to cancel, then navigation shortcuts work again. + +### Are there shortcuts for creating new views or tables? + +Currently, creating new views, tables, databases, or workspaces requires clicking through the interface. Shortcuts focus on data navigation, editing, and application building workflows. + +### Do shortcuts work in Form view or Gallery view? + +Most shortcuts are designed for Grid view where spreadsheet-style navigation makes sense. Form view and Gallery view use different interaction patterns that rely more on clicking and scrolling. Application Builder has its own set of shortcuts listed above. + +## Related content + +- [Introduction to Baserow][7] +- [Quick start: Your path to Baserow mastery][8] +- [Introduction to Grid view](/user-docs/guide-to-grid-view) +- [Application Builder overview][4] +- [Working with rows](/user-docs/overview-of-rows) +- [Baserow glossary][10] + +--- + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + +[1]: /user-docs/file-field +[2]: /user-docs/link-to-table-field +[3]: /user-docs/boolean-field +[4]: /user-docs/application-builder-overview +[5]: /user-docs/add-and-remove-elements +[6]: /user-docs/elements-overview +[7]: /user-docs/baserow-basics +[8]: /user-docs/how-to-get-started-with-baserow +[9]: /user-docs/set-up-baserow +[10]: /user-docs/learn-baserow-basic-concepts",,baserow_user_docs,https://baserow.io/user-docs/baserow-keyboard-shortcuts +126,Personal views,personal-views,Baserow: Creating personal views,"# Personal views + +Personal views are private views visible only to you. Create custom filters, sorts, and configurations for your individual workflow without disrupting shared team views. + +This guide covers how personal views in Baserow let you create private, customized views of table data without affecting other workspace members' views. + +To learn more about views in general, check out the [views overview](/user-docs/overview-of-baserow-views). + +## What are personal views? + +**Personal views are private view configurations visible only to their creator.** While [collaborative views](/user-docs/collaborative-views) are shared with all workspace members, personal views let you customize how you see and work with data independently. + +Personal views are ideal when you need specific filters, custom sorts, or unique field arrangements that don't apply to the broader team. Your personal view configurations never affect other users' views or the underlying table data. + +> Personal views are available on [paid plans](/user-docs/pricing-plans). Free plan users can only create collaborative views. + +![Personal views in Baserow](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/dd0ed15e-fb8c-4d64-9beb-1e5ee3610a7a/Screenshot_2023-03-07_at_18.12.46.png) + +## Personal vs collaborative views + +When creating a new view, you choose between two permission types: +1. **[Collaborative views](/user-docs/collaborative-views)** - Visible and configurable by all [workspace members](/user-docs/working-with-collaborators) +2. **Personal views** - Only visible to the user creating them + +Understanding the differences helps you choose the right view type: + +| Feature | Personal views | Collaborative views | +|---------|----------------|---------------------| +| **Visibility** | Only you | All workspace members | +| **Who can edit** | Only you | Members with edit permissions | +| **Premium feature** | Yes | No | +| **Use cases** | Individual workflows, experiments | Team dashboards, shared processes | +| **Configuration changes** | Affect only you | Affect everyone | +| **Best for** | Custom filters, personal organization | Standardized views, team alignment | +| **Minimum per table** | Optional | At least one required | + +You can convert views between types anytime by clicking the three-dot menu (⋮) next to the view name and selecting the conversion option. + +## How to create a personal view + +1. Click the **view dropdown** at the top of the table +2. Select a **view type** from the bottom section +3. Choose **Personal** as the view permission type +4. Enter a **name** for your view +5. Click **Create view** + +Your new personal view appears in your view list but remains hidden from other workspace members. + +### Convert a collaborative view to personal + +Transform any collaborative view into a personal view: + +1. Click the **view dropdown** at the top of the table +2. Find the collaborative view you want to convert +3. Click the **three-dot menu (⋮)** next to the view name +4. Select **Change to personal view** +5. Confirm the change + +The view immediately becomes private to you and disappears from other users' view lists. + +### Convert a personal view to collaborative + +Share your personal view configuration with the team: + +1. Click the **view dropdown** at the top of the table +2. Find the personal view you want to share +3. Click the **three-dot menu (⋮)** next to the view name +4. Select **Change to collaborative view** +5. Confirm the change + +The view becomes visible to all workspace members who can then see and modify it according to their permissions. + +## Managing personal views + +### Viewing your personal views + +When you open the view dropdown, you see both collaborative views and your own personal views. Personal views are indicated by a personal icon and only appear in your view list. + +![Personal views in the view dropdown](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/9f6dd870-7ad3-4684-bc8f-4c9e9ddbb0b2/Screenshot_2023-03-07_at_18.32.00.png) + +Other workspace members cannot see, access, or modify your personal views; they remain completely private to you. + +### Configuring personal views + +As the owner of a personal view, you have full control over: +- **[Filters](/user-docs/view-customization)** - Show only records matching your criteria +- **Sorts** - Order data by any field +- **[Field visibility and order](/user-docs/field-customization)** - Hide, show, or rearrange columns +- **[Row heights](/user-docs/navigating-row-configurations)** - Adjust row size for your preference +- **[Row coloring](/user-docs/row-coloring)** - Apply conditional formatting +- **[Grouping][1]** - Organize records by field values (grid view) + +Changes to personal view configurations only affect your view. Other users' views remain unchanged. + +## Limitations and requirements + +### Minimum collaborative view requirement + +**Every table must have at least one [collaborative view](/user-docs/collaborative-views).** You cannot convert the last collaborative view to a personal view. This ensures all workspace members can access table data. + +If you try to convert the only collaborative view, Baserow displays an error. Create a new collaborative view first, then convert the original. + +### Premium feature restriction + +Personal views require a [paid](/user-docs/pricing-plans). Free plan users see the personal view option but cannot create personal views. + +To create personal views: +1. Upgrade your workspace to a paid plan +2. Existing collaborative views remain accessible +3. All workspace members on paid plans can create personal views + +### Duplication behavior + +When you [duplicate a table](/user-docs/create-a-table#duplicate-a-table) containing personal views: + - Personal views are retained in the duplicate + - Original view ownership is preserved + - Even if the original creator leaves the workspace, their personal views remain in duplicated tables + - Other users cannot see these orphaned personal views + + +## When to use personal views + +### Individual task management +Filter project tables to show only tasks assigned to you, with your preferred priority sorting. Other team members maintain their own personal views with different filters. + +### Experimental configurations +Test new view layouts, filters, or groupings without disrupting team workflows. Once you've perfected the configuration, convert it to a collaborative view or share your approach with the team. + +### Personal productivity systems +Create views that match your work style: daily task lists, weekly planning boards, or custom reporting views that align with how you track your work. + +### Role-specific perspectives +Sales team members might create personal views showing their accounts, while support staff create views filtering for their assigned tickets; all from the same table. + +### Temporary analysis +Build quick views for one-time data analysis or reporting without cluttering the workspace with views others don't need. Delete the personal view when done. + +### Private information handling +When working with sensitive data, personal views prevent accidental exposure of filtered information to team members who shouldn't see certain records. + +## Frequently asked questions + +### Can workspace administrators see my personal views? + +No. Personal views are completely private. Even workspace owners and administrators cannot access, view, or modify your personal views. The only exception is if the administrator duplicates a table; then they see the structure, but not your specific view configurations. + +### What happens to my personal views if I leave the workspace? + +Your personal views are deleted when you leave the workspace. Other members cannot access or inherit them. If you want to preserve a view configuration, convert it to a collaborative view before leaving or document the filter/sort settings. + +### Can I share a personal view with specific team members? + +Not directly. Personal views are either private (personal) or visible to all workspace members (collaborative). To share with specific people, convert the view to collaborative, let them duplicate it as their own personal view, then convert your original back to personal. + +### Do personal views count toward any limits? + +No. There's no limit to the number of personal views you can create per table. However, creating too many views can make navigation difficult. Consider organizing with clear naming conventions and deleting views you no longer use. + +### Can I export data from a personal view? + +Yes. You can [export data](/user-docs/export-a-view) from personal views just like collaborative views. The export includes only records visible in your filtered view, making it useful for creating custom reports. + +### Will my personal view filters affect what others see? + +No. Personal view filters only control what you see. Other users' views are completely independent. If you filter to show only your assigned tasks, team members still see all tasks in their collaborative views. + +### Can I convert all collaborative views to personal views? + +No. Every table must maintain at least one collaborative view. This ensures all workspace members can access the table data. You can convert all but one collaborative view to personal views. + + +## Related content + +### View basics +- [Views overview](/user-docs/create-custom-views-of-your-data) - Understanding view concepts +- [Collaborative views](/user-docs/collaborative-views) - Shared team views +- [View configuration options](/user-docs/view-customization) - Filters, sorts, and settings +- [Create custom views](/user-docs/create-custom-views-of-your-data) - Step-by-step guide + +### View customization +- [Filters in Baserow](/user-docs/filters-in-baserow) - Filter configuration +- [Field customization](/user-docs/field-customization) - Visibility and ordering +- [Row configuration](/user-docs/navigating-row-configurations) - Height and formatting +- [Row coloring](/user-docs/row-coloring) - Conditional formatting + +### Collaboration +- [Working with workspace collaborators](/user-docs/working-with-collaborators) - Team management +- [Permissions overview](/user-docs/permissions-overview) - Access control +- [Export a view](/user-docs/export-a-view) - Download view data + +### Plans and features +- [Pricing plans](/user-docs/pricing-plans) - Feature availability by plan +- [Premium features](https://baserow.io/pricing) - Complete feature comparison + +--- + + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow.io/user-docs/group-rows-in-baserow",,baserow_user_docs,https://baserow.io/user-docs/personal-views +127,Collaborative views,collaborative-views,Baserow: Share and collaborate on views,"# Collaborative views + +Collaborative views are shared with all workspace members who have access to the table. They provide a common way for teams to see and interact with data together. + +This guide covers how collaborative views work in Baserow, when to use them instead of personal views, and how to manage shared views for team collaboration. + + +To learn more about views in general, check out the [views overview](/user-docs/overview-of-baserow-views). + +## What are collaborative views? + +Collaborative views are shared views visible to all workspace members with table access. Any member with appropriate permissions can configure collaborative views, making them ideal for team dashboards, shared workflows, and standardized data presentations. + +When you create a new table, the default Grid view is automatically a collaborative view. All workspace members see the same view configuration, including filters, sorts, field visibility, and formatting. + +## Collaborative vs personal views + +Understanding when to use each view type helps organize your workspace effectively: + +| Feature | Collaborative views | Personal views | +|---------|-------------------|----------------| +| **Visibility** | All workspace members | Only the creator | +| **Who can edit** | Members with edit permissions | Only the creator | +| **Default for new tables** | Yes | No | +| **Use cases** | Team dashboards, shared processes | Individual workflows, experiments | +| **Configuration changes** | Affect everyone | Affect only you | +| **Best for** | Standardized views, team alignment | Custom filters, personal organization | + +Learn more about [personal views](/user-docs/personal-views) and their specific benefits. + +![Creating a new collaborative view in Baserow](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/cacbb156-2d99-48f5-84a1-0496ec16797b/Screenshot%202023-03-07%20at%2018.07.38.png) + +## How to create collaborative views + +Collaborative views are the default view type when creating new views. + +### Create a new collaborative view + +1. Click the **view dropdown** at the top of the table +2. Select a **view type** from the bottom section +3. Ensure **Collaborative** is selected as the permission type (this is the default) +4. Enter a **name** for your view +5. Click **Create view** + +The new collaborative view appears in the view list for all workspace members with access to the table. + +### Convert a personal view to collaborative + +You can change any personal view to collaborative: + +1. Click the **view dropdown** at the top of the table +2. Find the personal view you want to convert +3. Click the **three-dot menu (⋮)** next to the view name +4. Select **Change to collaborative view** +5. Confirm the change + +Once converted, the view becomes visible to all workspace members. This action cannot be undone directly; you'll need to convert it back to personal if needed. + +### Convert a collaborative view to personal + +You can also make collaborative views private: + +1. Click the **view dropdown** at the top of the table +2. Find the collaborative view you want to convert +3. Click the **three-dot menu (⋮)** next to the view name +4. Select **Change to personal view** +5. Confirm the change + +The view disappears from other users' view lists and becomes private to you. Other members lose access to this specific view configuration. + +![personal to collaborative view][1] + +## Permissions for collaborative views + +### Who can see collaborative views? + +All [workspace members](/user-docs/working-with-collaborators) with access to the table can see collaborative views. This includes: +- Workspace owners and administrators +- Members with table-level permissions +- Users assigned specific database roles + +### Who can edit collaborative views? + +Members can configure collaborative views based on their workspace and table permissions: +- **Owners and Admins** - Full access to create, edit, and delete collaborative views +- **Builders** - Can create and modify collaborative views +- **Editors** - Can modify existing views but may have limited creation rights +- **Commenters and Viewers** - Read-only access, cannot modify view configuration + +However, members can still edit data within collaborative views according to their field-level and row-level permissions. + +### Permission inheritance + +Collaborative views inherit permissions from the workspace and table level. If a user has read-only access to a table, they can see collaborative views but cannot change filters, sorts, or other view settings. + +Learn more about [Baserow permissions](/user-docs/permissions-overview). + +## When to use collaborative views + +**Team dashboards and reporting** +Create collaborative views when multiple team members need to see data the same way. Sales pipelines, project status boards, and performance dashboards work best as collaborative views. + +**Standardized workflows** +Use collaborative views to maintain consistent processes across your team. Everyone follows the same kanban board columns, form layouts, or calendar schedules. + +**Client or stakeholder presentations** +Share collaborative views with external users through [public sharing](/user-docs/public-sharing). Everyone accessing the shared link sees the same curated data presentation. + +**Onboarding and training** +New team members can immediately access properly configured views without needing to set up their own. Collaborative views serve as templates for how data should be organized. + +**Cross-functional collaboration** +When multiple departments work with the same data, collaborative views ensure everyone operates from the same information. Marketing, sales, and support teams can share customer data views. + +**Documentation and standards** +Maintain reference views that demonstrate proper data organization, naming conventions, or workflow stages for your team. + +## Frequently asked questions + +### What happens to a collaborative view if I convert it to personal? + +When you convert a collaborative view to personal, it disappears from other users' view lists immediately. They lose access to that view configuration, but the underlying table data remains unchanged. Other users can still create their own views or use remaining collaborative views. + +### Can I create a copy of a collaborative view as a personal view? + +Yes. [Duplicate the collaborative view](/user-docs/create-custom-views-of-your-data#how-to-duplicate-a-view), then convert the duplicate to a personal view. This lets you experiment with different configurations without affecting the shared collaborative view. + +### Do changes I make to a collaborative view affect everyone immediately? + +Yes. When you modify a collaborative view (change filters, sorts, field visibility, etc.), those changes appear immediately for all users viewing that same view. This is why personal views are better for experimentation. When working with collaborative views, coordinate with your team by announcing major view configuration changes in team channels. + +### Can other users see my personal views? + +No. [Personal views](/user-docs/personal-views) are completely private to you. Other workspace members cannot see, access, or modify your personal views, even workspace administrators. + +### How many collaborative views can I create per table? + +There's no limit to the number of collaborative or personal views per table. However, too many shared views can make navigation difficult for team members. Consider organizing views with clear names and archiving unused ones. + +### Can I restrict which team members see specific collaborative views? + +Not directly. Collaborative views are visible to all members with table access. To restrict view access, you need to use table-level or database-level permissions to control who can access the table itself. Alternatively, use [personal views](/user-docs/personal-views) for private configurations. + +## Related resources + +### View basics +- [Views overview](/user-docs/overview-of-baserow-views) - Understanding view concepts +- [Create custom views](/user-docs/create-custom-views-of-your-data) - Step-by-step view creation +- [Personal views](/user-docs/personal-views) - Private individual views +- [View configuration options](/user-docs/view-customization) - Filters, sorts, and settings + +### View types +- [Grid view guide](/user-docs/guide-to-grid-view) - Spreadsheet interface +- [Gallery view guide](/user-docs/guide-to-gallery-view) - Visual card display +- [Form view guide](/user-docs/guide-to-creating-forms-in-baserow) - Data collection +- [Kanban view guide](/user-docs/guide-to-kanban-view) - Project boards +- [Calendar view guide](/user-docs/guide-to-calendar-view) - Event scheduling + +### Collaboration features +- [Working with workspace collaborators](/user-docs/working-with-collaborators) - Team management +- [Share a view publicly](/user-docs/public-sharing) - External access +- [Permissions overview](/user-docs/permissions-overview) - Access control +- [Manage workspace members](/user-docs/manage-workspace-permissions) - User roles + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/471baf86-2b55-4efc-ad96-a8437bd31574/Personal%20to%20collaborative.jpg",,baserow_user_docs,https://baserow.io/user-docs/collaborative-views +128,Row coloring,row-coloring,Row coloring in a Baserow grid view,"# Row coloring in Baserow + +Row coloring transforms how you scan and understand your data at a glance, helping teams spot patterns, track status, and prioritize tasks without reading every cell. + +This guide explains how to use row coloring to visually organize data in your Baserow views using color coding based on single select fields or custom conditions. + +> **Premium feature:** Row coloring is available on [paid plans][1]. Upgrade to apply custom colors and visual decorators to your rows. + +## Overview + +Row coloring adds visual organization to your Baserow tables by applying colors based on field values or custom conditions. This feature helps you quickly identify patterns, prioritize items, and organize information visually across Grid, Gallery, and Kanban views. + +Each view maintains its own independent coloring configuration, allowing you to optimize the visual presentation for different audiences or purposes. You can color rows based on single select field values for simple categorization, or create sophisticated conditional rules that automatically apply colors when records meet specific criteria. + +![image Row coloring in Baserow Grid View][2] + +## Row coloring options + +### Decorator types + +| Decorator type | Visual effect | Best for | +|---------------|---------------|----------| +| **Left border** | Colored flag on the left edge of rows/cards | Subtle indicators that don't distract from content | +| **Background color** | Full row background color | Bold visual separation, high-priority items | + +### Coloring methods + +| Method | Works with | Use case | +|--------|------------|----------| +| **Single select field** | Single select fields only | Status tracking, categories, departments | +| **Conditions** | Any field type | Complex rules, multi-field logic, priority systems | + +## When to use row coloring + +**Status tracking:** Color rows by project status (Not Started, In Progress, Complete) using single select fields for instant visual progress updates. + +**Priority management:** Apply conditional coloring to highlight high-priority tasks, overdue items, or records requiring immediate attention. + +**Category identification:** Use single select coloring to distinguish between different types of records, departments, or product categories at a glance. + +**Pattern recognition:** Set up conditional rules to automatically highlight outliers, budget overruns, or performance metrics that exceed thresholds. + +## How to add row coloring + +1. Click the **Color** button in the view toolbar at the top of your table +2. Choose your decorator type: + - **Left Border** - Adds a colored flag to the left edge of rows + - **Background color** - Applies color to the entire row +3. Select your coloring method: + - [Single select field][3] - Match colors to a single select field + - [Conditions][4] - Create custom rules for automatic coloring +4. Configure your chosen method (see detailed instructions below) + +> Each view can have one decorator of each type (one left border configuration and one background color configuration). + +## How to color rows by single select field + +Single select field coloring automatically matches row colors to the colors assigned in your single select field options. This method is ideal for simple categorization where each row belongs to one category. + +1. Click **Color** in the view toolbar +2. Choose your decorator type (Left Border or Background color) +3. Select **Single select** as the coloring method +4. Choose which single select field should control the row colors +5. If no single select field exists, create one when prompted + +The row colors automatically update whenever you change a record's single select value. + +![Row coloring by single select field](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/b5d4de8a2991e78ad9ec869a5a909ab5ad516df4.webp) + +**Example:** A project tracking table with a ""Status"" single select field (Not Started, In Progress, Complete) automatically colors rows to match each status, making project progress visible at a glance. + +## How to color rows by conditions + +Conditional coloring applies colors automatically when records meet specific criteria you define. This method works with any field type and supports complex multi-field logic. + +1. Click **Color** in the view toolbar +2. Choose your decorator type (Left Border or Background color) +3. Select **Conditions** as the coloring method +4. Click **Add condition** or **Add condition group** to create your first rule +5. Define your condition: + - Select a field to evaluate + - Choose an operator (equals, contains, is greater than, etc.) + - Enter the comparison value +6. Choose a color for records matching this condition +7. Add additional conditions as needed by clicking **Add condition** or **Add condition group** +8. Optionally, click **+ add color** to set a default color for rows that don't match any conditions. This color applies by default. + +Conditional coloring evaluates continuously, so colors update automatically when data changes. Learn more about [creating filter conditions][5]. + +![Row coloring by conditions](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/68ab149b8ea8f1cfbaf0f8992221a7ea887154d8.webp) + +**Example:** An invoicing table that automatically colors rows red when the ""Due Date"" field is in the past and the ""Status"" field is not ""Paid,"" making overdue invoices immediately visible. + +## How to change row coloring + +Update your coloring configuration at any time without losing your data: + +1. Click **Color** in the view toolbar +2. Select the decorator you want to modify (Left border or Background color) +3. Click the dropdown menu to switch between Single select and Conditions +4. Reconfigure with your new settings + +You can also modify individual color values or conditions within an existing configuration without switching methods. + +![Changing row coloring configuration](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/Screenshot_2022-06-16_at_07.34.30.png) + +## How to remove row coloring + +Remove coloring from a specific decorator type: + +1. Click **Color** in the view toolbar +2. Select the decorator you want to remove (Left border or Background color) +3. Click the **delete** icon next to the color specification + +This removes the coloring configuration but doesn't affect your underlying data. + +![Deleting row coloring](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/Screenshot_2022-06-16_at_07.31.23.png) + +## Frequently asked questions + +### Can I use row coloring on free plans? + +No, row coloring is a paid feature. You need a [paid plan][1] to apply custom colors and visual decorators to your rows. Free plans can view colored rows created by paid users. + +### Does row coloring affect other views of the same table? + +No, row coloring is view-specific. Each view (Grid, Gallery, Kanban) can have its own independent coloring configuration. This allows you to optimize the visual presentation for different purposes without affecting other views. + +### Can I use both left border and background color at the same time? + +Yes, you can configure one left border decorator and one background color decorator simultaneously on the same view. However, you can only have one configuration of each type per view. + +### What's the difference between single select coloring and conditional coloring? + +Single select coloring automatically matches row colors to your single select field options, simple and visual. Conditional coloring evaluates rules you define and can work with any field type, supporting complex logic like ""color red if amount > $1000 AND status is pending."" + +### How many conditional color rules can I create? + +There's no fixed limit on the number of conditional color rules. However, for performance and clarity, consider consolidating related conditions and keeping your rule set focused on the most important visual indicators. + +### Do colored rows appear in exported data? + +Row coloring is a visual feature within Baserow views and does not export as cell background colors in CSV or Excel files. The underlying data exports normally, but visual decorators remain in the Baserow interface. + +## Related content + +- [Single select field][6] - Learn about the field type used for simple row coloring +- [View customization][5] - Explore other view configuration options +- [Filters in Baserow][7] - Understand how to create conditions +- [Grid View guide][8] - Learn about Grid View features +- [Gallery View guide][9] - Explore Gallery View with row coloring +- [Kanban View guide][10] - Discover Kanban View coloring options + +--- + + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: /user-docs/pricing-plans + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/a4a5bae7-65dd-41b1-8f1e-37ca39e40b1a/Row%20coloring.jpg + [3]: #how-to-color-rows-by-single-select-field + [4]: #how-to-color-rows-by-conditions + [5]: /user-docs/view-customization + [6]: /user-docs/single-select-field + [7]: /user-docs/filters-in-baserow + [8]: /user-docs/guide-to-grid-view + [9]: /user-docs/guide-to-gallery-view + [10]: /user-docs/guide-to-kanban-view",,baserow_user_docs,https://baserow.io/user-docs/row-coloring +129,Enlarge rows,enlarging-rows,Enlarge row view in Baserow,"# Row detail panel in Baserow (modal view) + +The row detail panel gives you a focused workspace for editing complex records with multiple fields, eliminating the need to scroll horizontally across your table while keeping all information for one record in view. + +This guide explains how to use the row detail panel to view and edit all fields in a single record, including working with linked rows, hidden fields, and comments in an expanded view. + +## Overview + +The row detail panel (also called the expanded row view) opens a dedicated editing interface for a single row, displaying all fields vertically in a form-like layout. This panel provides a comprehensive view of one record at a time, making it ideal for working with tables that have many fields or require detailed data entry. + +Unlike inline editing where you click individual cells in the grid, the row detail panel shows every field for the selected row in one place. You can edit multiple fields, add comments, view row history, and even edit linked rows without leaving the panel. Hidden fields remain hidden in this view to maintain consistency with your table configuration. + +## When to use the row detail panel + +Use the row detail panel instead of inline editing when you need to: + +| Scenario | Why use the panel | +|----------|-------------------| +| **Editing records with many fields** | Avoid horizontal scrolling across wide tables | +| **Working with long text content** | See full content in multi-line fields without cell constraints | +| **Reviewing complete records** | View all information for a single item in one place | +| **Editing linked rows** | Modify related records without switching tables | +| **Adding context with comments** | Collaborate on specific records with team feedback | +| **Entering detailed data** | Focus on one record without distractions from other rows | + +## How to open the row detail panel + +Opening the row detail panel takes just one click from any table view: + +1. Navigate to the table containing the row you want to view +2. Locate the row you want to open +3. Click the **expand icon** (arrow) on the left side of the row number + +The panel opens immediately, displaying all fields for that row in a vertical layout. + +![Opening the row detail panel in Baserow](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/2230602e-5ffa-49a2-a65e-e34efc91a5d6/Screenshot%202023-07-18%20at%2014.14.17.png) + +> **Keyboard shortcut:** Click a row to select it, then press **Enter** to open the row detail panel quickly. + +## Features in the row detail panel + +### Edit all fields in one place + +The panel displays every field vertically, allowing you to edit multiple fields sequentially without scrolling horizontally. Changes save automatically as you move between fields, just like inline editing. + +### Work with linked rows + +Link to table fields in the expanded view lets you edit linked rows directly without switching between tables. Click the expand icon next to any linked row to open its detail panel, make your changes, and return to the original record, all within the same workflow. + +### Row change history + +You'll be able to [track any changes to any row][1]. Every row has its own history that records what was changed, when it was changed, and who made the change. This helps you keep track of updates, restore previous values, and maintain data accuracy over time. + +### Add and view comments + +Access the comments panel on the right side to collaborate with team members about specific records. [Row comments][2] let you mention colleagues, ask questions, or provide context about the data in that row. + +![Editing fields in the row detail panel](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/f07e465e-861f-413c-acfd-4e6295b6f741/Edit%20values.png) + +### Track comments + +You can [select to get alerts][3] only when someone mentions you in a comment. Or, you can get alerts for all comments in a row, even if no one mentions you. + +### Add field in row detail panel + +While viewing an expanded row, you can create new fields without closing the panel. This allows you to experiment with different field types while maintaining context on the current record. + + +### Hidden fields stay hidden + +If you've hidden fields in your table view, those fields remain hidden in the row detail panel. This maintains consistency with your view configuration and keeps the focus on relevant information. + +![Closing the row detail panel](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/553aac6ba5c1ed35ad98130e257b9b2bb0c4864b.webp) + +## How to close the row detail panel + +Close the panel and return to your table view: + +- Click the **X icon** in the top-right corner of the panel, or +- Press the **Escape** key on your keyboard + +Your changes are already saved automatically; no need to click a save button. + + + +## Row detail panel vs. inline editing + +| Feature | Row detail panel | Inline editing | +|---------|------------------|----------------| +| **View all fields** | ✓ Shows all fields vertically | ✗ Requires scrolling for wide tables | +| **Edit multiple fields** | ✓ Easy sequential editing | ◐ Must click each cell individually | +| **See long text content** | ✓ Full content visible | ✗ Truncated in cell | +| **Add comments** | ✓ Comment panel included | ✗ Must open panel separately | +| **Edit linked rows** | ✓ Edit without switching tables | ◐ Opens new panel | +| **Speed for single cells** | ◐ Requires panel open/close | ✓ Instant click-to-edit | +| **See context of other rows** | ✗ Only one row visible | ✓ Full table visible | + +## Frequently asked questions + +### What's the difference between the row detail panel and the row select modal? + +The row detail panel opens from your main table to edit existing rows with all fields displayed. The [row select modal][5] appears when creating relationships in link to table fields, showing a list of rows to choose from. They serve different purposes in your workflow. + +### Can I open multiple row detail panels at the same time? + +No, you can only view one row detail panel at a time. However, when editing linked rows from within the panel, you can navigate through multiple linked records in sequence without closing the main panel. + +### Do changes in the row detail panel save automatically? + +Yes, all changes save automatically as you edit, just like inline editing in the grid. There's no save button; your edits are immediately stored and visible to collaborators. + +### Can I delete a field from the row detail panel? + +Yes, open the panel's context menu (three dots icon) and select ""Delete field."" This is useful when reviewing records and deciding whether to keep or remove a field. + +### Will hidden fields show in the row detail panel? + +No, fields hidden in your table view remain hidden in the row detail panel. To see hidden fields, you can unhide them in the table view or in the panel's context menu. + +### Can I navigate between rows while the panel is open? + +Yes, use the arrow buttons at the top of the panel to move to the previous or next row without closing the panel. This allows you to review or edit multiple records sequentially. + +## Related content + +- [Rows overview][6] - Learn fundamental row concepts +- [Create a row][7] - Add new records to your tables +- [Row configuration options][8] - Customize row appearance and behavior +- [Row commenting and mentions][2] - Collaborate on specific records +- [Link to table field][9] - Create relationships between tables +- [Row change history][10] - Track changes made to rows over time + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow.io/user-docs/row-change-history + [2]: /user-docs/row-commenting + [3]: https://baserow.io/user-docs/row-commenting + [4]: https://baserow.io/user-docs/adding-a-field + [5]: /user-docs/how-to-make-new-rows#create-a-row-from-the-row-select-modal + [6]: /user-docs/overview-of-rows + [7]: /user-docs/how-to-make-new-rows + [8]: /user-docs/navigating-row-configurations + [9]: /user-docs/link-to-table-field + [10]: /user-docs/row-change-history",,baserow_user_docs,https://baserow.io/user-docs/enlarging-rows +130,Create rows,how-to-make-new-rows,Create a Baserow row for your table,"# How to create a row in Baserow + +Creating rows in Baserow gives you multiple options to add data quickly; whether you need a single blank record, want to duplicate existing data, or insert rows at specific positions. + +This guide explains all the methods for creating new rows in Baserow, from manual entry to keyboard shortcuts, so you can efficiently add data to your tables. + +## Overview + +Rows are individual records in your Baserow tables that store your data. Each time you create a row, Baserow automatically assigns it a unique row ID for easy reference and tracking. + +Baserow offers flexible ways to create rows, each suited to different workflows. You can add rows manually with a click, use keyboard shortcuts for speed, duplicate existing rows to save time, or import multiple rows at once from CSV files. For advanced users, the [API][1] enables programmatic row creation. + +## Methods for creating rows + +| Method | Best for | Speed | +|--------|----------|-------| +| Plus button at bottom | Single new records | Fast | +| Right-click menu | Inserting rows at specific positions | Fast | +| Keyboard shortcut (`Shift + Enter`) | Power users navigating with arrow keys | Fastest | +| Duplicate row | Creating similar records | Fast | +| Copy and paste | Adding multiple rows with existing data | Medium | + +## How to create a blank row + +Adding a new empty row is the most common way to start entering data. Choose from these methods: + +1. **Click the plus icon (+)** at the bottom of any table view after the last row +2. **Right-click an existing row** and select ""Insert row above"" or ""Insert row below"" +3. **Use the keyboard shortcut** `Shift + Enter` while navigating with the arrow keys to add a row below your current position + +The new row appears instantly with empty fields ready for data entry. Learn more about [keyboard shortcuts][2] to speed up your workflow. + +![Creating a new row in Baserow image][3] + +## How to duplicate a row + +Duplicating saves time when creating similar records: + +1. Open the table containing the row you want to duplicate +2. Click the row to select it +3. Right-click the row to open the context menu +4. Select **Duplicate row** + +Baserow creates an exact copy immediately below the original row with all field values preserved. + +## How to create a row in a linked table + +When working with [link to table fields][4], you can create rows directly in the linked table without switching views: + +1. Open a table containing a link to table field +2. Click the plus icon (+) in the link to table field to open the row select modal +3. Click the plus icon (+) at the bottom of the modal +4. Enter data for each field in the form +5. Click **Create** to save the new row + +The new row appears in the linked table and becomes available as an option in your original table. + +![Image create a row in a linked table][5] + + +## How to create multiple rows at once + +To add several empty rows quickly: + +1. Right-click the plus icon (+) at the bottom of any table view after the last row +2. In the context menu, specify how many rows to create +3. The rows appear immediately in your table + +![Creating multiple rows at once](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/d689df9a-cfd7-40b6-88de-5c80cfc6322b/Screenshot%202023-06-27%20at%2021.25.48.png) + +> Baserow provides a [bulk‑create endpoint][1] that lets you insert many rows into one table in a single API request. + +For importing data in bulk, see our guide on [pasting data into cells][6] or [importing data into existing tables][7]. + +## Frequently asked questions + +### What happens to row IDs when I create a new row? + +Each new row automatically receives the next available row ID in sequence. Row IDs are permanent and never change, even if you delete rows or rearrange your table. + +### Can I create rows in multiple tables at the same time? + +Yes, you can create rows in several tables as part of a single automation or [API][1], but the Baserow UI only lets you add rows one table at a time. However, when you create a row in a linked table using the row select modal, that new row becomes immediately available in the original table's link to table field. + +### What's the fastest way to add multiple blank rows? + +Use the right-click method to specify a number of rows, or use `Shift + Enter` repeatedly while navigating with the arrow keys. For importing data from other sources, [paste data directly][6] or [import from CSV files][8]. + +### Do new rows appear in all views of my table? + +Yes, new rows appear across all views of the same table. However, filters applied to specific views may hide the new row if it doesn't match the filter criteria. + +### Can I undo row creation? + +Yes, press `Ctrl + Z` (Windows) or `Cmd + Z` (Mac) immediately after creating a row to undo the action. You can also manually delete rows by right-clicking and selecting ""Delete row."" + +## Related content + +- [Overview of rows][9] - Learn about row features and capabilities +- [Paste data into cells][6] - Import data quickly from your clipboard +- [Row configuration options][10] - Customize how rows appear and behave +- [Create a table via import][8] - Import entire tables from CSV files +- [Keyboard shortcuts][2] - Speed up your Baserow workflow + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://api.baserow.io/api/redoc/ + [2]: /user-docs/baserow-keyboard-shortcuts + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/d81b0ee6-50c2-4358-b3e6-f8d19a6763a1/Row%20config.jpg + [4]: /user-docs/link-to-table-field + [5]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/a01a94d5-6bbf-41b0-bf23-9dfc5d9ae26a/create%20a%20row%20in%20a%20linked%20table.jpg + [6]: /user-docs/paste-data-into-baserow-table + [7]: /user-docs/import-data-into-an-existing-table + [8]: /user-docs/create-a-table-via-import + [9]: /user-docs/overview-of-rows + [10]: /user-docs/navigating-row-configurations",,baserow_user_docs,https://baserow.io/user-docs/how-to-make-new-rows +131,Formula field overview,formula-field-overview,Baserow Formula field guide,"# Formula field overview + +Formula fields let you create dynamic calculations and text transformations without manual data entry. Whether you're calculating totals, formatting dates, or combining information from multiple fields, formulas make your database work smarter. + +Learn how to use Baserow's Formula fields to perform calculations, manipulate text, and automate data processes across your tables. + + + +## What are Formula fields? + +**Formula fields automatically calculate values based on other fields in your table.** They update in real-time when source data changes, making them ideal for totals, averages, date calculations, text formatting, and conditional logic. + +The Formula field is available for all Baserow plan types and works seamlessly with all [field types](/user-docs/field-customization). You can reference fields within the same table or from [linked tables](/user-docs/link-to-table-field). + + + +## Understanding formulas, functions, and expressions + +Before creating formulas, it's helpful to understand these three concepts: + +**Formula:** A complete instruction set that performs calculations or manipulates data. Formulas combine functions, operators, and field references to produce results. + +*Example:* `field('Current Quantity') * field('Cost')` calculates total price by multiplying two fields. + +**Function:** A predefined operation that takes inputs and produces outputs. Baserow includes mathematical, logical, text, and date/time functions. + +*Example:* `length(field('Product Name'))` returns the character count of a text field. + +**Expression:** A combination of values, operators, and functions that evaluates to a single result. Expressions are the building blocks of formulas. + +*Example:* `field('Current Quantity') * field('Cost')` is an expression using field references and the multiplication operator. + +## How to create a Formula field + +1. In your table, click the plus sign `+` to [add a new field](/user-docs/adding-a-field). +2. Select **Formula** as the field type +3. Enter your formula in the editor using [operators, functions, and field references](/user-docs/understanding-formulas) +4. Test the formula with sample data +5. Save when the results are correct + +![Formula buttons in Baserow](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/81b52ee9-8b60-4bab-a546-f9241f641d60/Untitled.png) + +## Common formula building blocks + +### Functions +- **SUM()** - Add numbers together +- **IF()** - Create conditional logic +- **CONCAT()** - Combine text strings +- **DATETIME_FORMAT()** - Format dates and times +- **AVERAGE()** - Calculate mean values + +### Operators +- **Arithmetic:** `+`, `-`, `*`, `/` +- **Comparison:** `=`, `<=`, `>=`, `<`, `>` +- **Logical:** `AND`, `OR`, `NOT` + +### Field references +Use `field('field_name')` to reference any field in your table. Field names are case-sensitive and must match exactly. + +## Frequently asked questions + +### Can I edit individual cells in a Formula field? + +No. Formula fields are calculated automatically for the entire column. Each cell displays the result of applying the formula to that row's data. If you need to edit specific values, convert the Formula field to a regular field type first. This will preserve the calculated values as static data. + +### What happens if I delete a field that's used in a formula? + +The Formula field will show an error because the reference no longer exists. To fix this, you can: +- Restore the deleted field from the trash +- Create a new field with the exact name +- Update the formula to remove the reference +- Rename another field to match the deleted field's name + +### Can formulas reference fields from other tables? + +Yes. Use [Link-to-table fields](/user-docs/link-to-table-field) to connect tables, then reference linked fields using [Lookup fields](/user-docs/lookup-field) in your formulas. This lets you pull data from related records into your calculations. + +### Do formulas update automatically when source data changes? + +Yes. Formula fields recalculate instantly when any referenced field values change. This makes them ideal for dashboards, reports, and tracking metrics that depend on current data. + +### What's the difference between a Formula field and a function? + +A Formula field is a column type that contains formulas. A function is a specific operation you use inside formulas (like `SUM()` or `IF()`). Think of functions as tools and formulas as the complete instructions that use those tools. + +> **Check the formula reference.** Review the [complete formula documentation](/user-docs/understanding-formulas) for all available functions and syntax examples. + +## Related resources + +### Documentation +- [Formula field reference](/user-docs/understanding-formulas) - Complete function library and syntax guide +- [Generate formulas with Baserow AI](/user-docs/generate-formulas-with-baserow-ai) - Let AI write formulas for you +- [Link-to-table field](/user-docs/link-to-table-field) - Connect tables for cross-table formulas +- [Lookup field](/user-docs/lookup-field) - Pull data from linked records + +### Technical guides +- [Technical implementation of Baserow formulas](/docs/technical/formula-technical-guide) +- [Understanding Baserow formulas](/docs/tutorials/understanding-baserow-formulas) + +### Tutorials +- [Prioritize tasks by due dates with formulas](https://baserow.io/blog/prioritize-tasks-due-dates-with-baserow-formulas) +- [Check a date's day of the week using formulas](https://baserow.io/blog/check-date-specific-day-week-using-formulas) + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account",,baserow_user_docs,https://baserow.io/user-docs/formula-field-overview +132,Field overview,baserow-field-overview,Baserow field overview,"# Fields in Baserow tables + +Fields in Baserow are the building blocks of structured data; transforming simple spreadsheet columns into intelligent data types that validate input, create relationships, calculate values, and power your entire database architecture. + +This guide explains what fields are in Baserow, how to choose the right field type for your data, and how to use computed fields to create dynamic, interconnected databases. + + + +## Overview + +Fields (columns) define what type of data each part of your record can contain. Unlike spreadsheet columns that accept any text or number, Baserow fields enforce data types, ensuring email fields contain valid emails, date fields store proper dates, and link fields create genuine relationships between tables. + +Each field type comes with built-in validation, formatting, and specialized behaviors. A phone number field automatically formats digits as (555) 123-4567, a file field lets you upload documents, and a formula field performs calculations automatically. This intelligent structure prevents data entry errors and unlocks powerful features like filtering, sorting, and cross-table relationships. + +Fields span your entire table vertically, with each cell in the column containing data of the same type. Rows (records) span horizontally, with each row representing a complete item (customer, project, order) whose attributes are stored across multiple fields. + +![Fields and rows in Baserow Grid View][1] + +## Field categories + +Baserow organizes 25+ field types into categories based on their primary purpose. To choose the right field type, match your data needs to the appropriate field type using this decision framework. + +### Basic data fields + +Store fundamental information like text, numbers, and dates: + +| Field type | Best for | Example use | +|------------|----------|-------------| +| [Single line text][2] | Short text values | Names, titles, SKUs, codes | +| [Long text][3] | Paragraphs and descriptions | Product descriptions, notes, articles | +| [Number][4] | Numeric values and calculations | Prices, quantities, scores, measurements | +| [Date][5] | Calendar dates and times | Due dates, appointments, deadlines | +| [Boolean][6] | Yes/no, true/false values | Completed status, active/inactive flags | +| [Rating][7] | Star ratings or scores | Product reviews, priority levels (1-5) | + +### Validation and formatting fields + +Ensure data meets specific formats: + +| Field type | Validates | Example use | +|------------|-----------|-------------| +| [Email][8] | Valid email addresses | Contact emails, user accounts | +| [Phone number][9] | Phone number format | Customer phone numbers, support contacts | +| [URL][10] | Valid web addresses | Website links, documentation URLs | +| [Password][11] | Secure password storage | Credentials, access codes | + +### Selection and categorization fields + +Choose from predefined options: + +| Field type | Selection type | Example use | +|------------|----------------|-------------| +| [Single select][12] | One option only | Status (Draft/Published), Priority (Low/Medium/High) | +| [Multiple select][13] | Multiple options | Tags, categories, features, skills | +| [Collaborator][14] | Workspace members | Task assignees, project owners, reviewers | + +### Relationship and reference fields + +Connect data across tables: + +| Field type | Purpose | Example use | +|------------|---------|-------------| +| [Link-to-table][15] | Create relationships | Link orders to customers, tasks to projects | +| [Lookup][16] | Display linked table data | Show the customer name in order records by looking up the linked customer. | +| [Count][17] | Count linked rows | Count how many tasks are assigned to each project | +| [Rollup][18] | Aggregate data from linked rows | Calculate total revenue from all orders linked to a customer, average rating | + +### Automatic and computed fields + +Calculate or track data automatically: + +| Field type | Auto-generates | Example use | +|------------|---------------|-------------| +| [Formula][19] | Perform calculations using values from the same row | Total = `{Unit Price} * {Quantity}` automatically calculates line totals, full name combinations | +| [Autonumber][20] | Sequential numbers | Invoice numbers, ticket IDs, order numbers | +| [UUID][21] | Unique identifiers | API integration IDs, universal record identifiers | +| [Created on][22] | Row creation timestamp | When record was created | +| [Last modified][23] | Last update timestamp | When record was last changed | +| [Created by][24] | Creator's name | Who created the record | +| [Last modified by][25] | Last editor's name | Who made the most recent change | +| [Duration][26] | Time periods | Project duration, session length, time tracking | + +### Special purpose fields + +Unique functionality for specific needs: + +| Field type | Special capability | Example use | +|------------|-------------------|-------------| +| [File][27] | Upload documents/images | Product photos, contracts, attachments | +| [AI prompt][28] | AI-generated content | Summaries, translations, content generation | + + + +## Understand computed fields + +Computed fields automatically calculate, update, or reference values based on other data in your table or linked tables. Unlike manual entry fields, where you type values, computed fields generate their content automatically using rules you define. + +Common computed field types include [Formula fields][19], [Lookup fields][16], [Count fields][17], [Rollup fields][18], [Created on][22] / [Last modified][23], [Created by][24] / [Last modified by][25]. + +### Why computed fields matter + +**Data consistency:** Calculations update automatically when source data changes; no manual recalculation needed. + +**Reduced errors:** Automatic computation eliminates manual calculation mistakes and ensures accuracy across large datasets. + +**Dynamic relationships:** Changes in one table instantly reflect in linked tables through lookup and rollup fields. + +**Efficiency:** Set up the computation once, and it applies to every row, saving hours of repetitive work. + + + + +## Field operations and customization + +Each [field can be configured][30] to match your specific needs: + +- **[Sorting][31]:** Arrange rows by field values (A-Z, newest first, highest to lowest) +- **[Filtering][32]:** Show only rows matching specific field criteria +- **[Grouping][33]:** Organize rows into collapsible sections by field values +- **[Hiding][34]:** Control field visibility per view without deleting data +- **[Descriptions][35]:** Add explanatory text to help users understand field purpose + +These operations are view-specific; customize each view differently without affecting others or your underlying data. + +![Fields option in Baserow][29] + + +## Frequently asked questions + +### Can I change a field type after creating it? + +Yes, you can convert most field types through the [field configuration][30] menu. Baserow attempts to preserve data during conversion (e.g., numbers to text works seamlessly), but some conversions may result in data loss (e.g., text to number drops non-numeric values). Always review after conversion. + +### What's the difference between single-line text and long text? + +Single-line text stores short values (names, titles, codes) and displays in a single row. Long text stores paragraphs and displays with text wrapping across multiple lines. Use single-line for compact data and long text for descriptions or notes. + +### How do computed fields update when source data changes? + +Computed fields recalculate automatically and immediately when their source data changes. If you update a quantity in a row, any formula using that quantity updates instantly across all views. + +### Can I use multiple link-to-table fields to connect to the same table? + +Yes, you can create multiple link fields connecting to the same table, each representing different relationships. For example, a project table might link to a people table twice; once for ""Project Manager"" and once for ""Team Members."" + +### Do field changes affect my data or just the view? + +Field configuration changes (name, description, hide/show) don't affect data. However, changing field types may transform or lose data depending on the conversion. Sorting, filtering, and grouping only change how you view data without modifying it. + +### What's the maximum number of fields per table? + +Baserow doesn't impose a strict field limit, but practical performance considerations suggest keeping tables under 200 fields. For better organization, consider splitting very wide tables into related tables connected by link-to-table fields. + +## Related content + +- [Create a field][36] - Step-by-step field creation guide +- [Field configuration options][30] - Customize field behavior and appearance +- [Link-to-table field][15] - Create relationships between tables +- [Formula field reference][19] - Learn formula syntax and functions +- [Working with timezones][37] - Understand date/time field behavior +- [Field summaries][38] - Add calculations to field footers + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/f7ccdd55-380f-4385-b577-63f1c3a49bde/Fields.jpg + [2]: /user-docs/single-line-text-field + [3]: /user-docs/long-text-field + [4]: /user-docs/number-field + [5]: /user-docs/date-and-time-fields + [6]: /user-docs/boolean-field + [7]: /user-docs/rating-field + [8]: /user-docs/email-field + [9]: /user-docs/phone-number-field + [10]: /user-docs/url-field + [11]: /user-docs/password-field + [12]: /user-docs/single-select-field + [13]: /user-docs/multiple-select-field + [14]: /user-docs/collaborator-field + [15]: /user-docs/link-to-table-field + [16]: /user-docs/lookup-field + [17]: /user-docs/count-field + [18]: /user-docs/rollup-field + [19]: /user-docs/understanding-formulas + [20]: /user-docs/autonumber-field + [21]: /user-docs/uuid-field + [22]: /user-docs/date-and-time-fields + [23]: /user-docs/date-and-time-fields + [24]: /user-docs/created-by-field + [25]: /user-docs/last-modified-by-field + [26]: /user-docs/duration-field + [27]: /user-docs/file-field + [28]: /user-docs/ai-field + [29]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/d0aeed55-5b39-4a09-9701-7b24b6c826c4/Fields%20option%20in%20Baserow.jpg + [30]: /user-docs/field-customization + [31]: /user-docs/field-customization + [32]: /user-docs/filters-in-baserow + [33]: https://baserow.io/user-docs/group-rows-in-baserow + [34]: /user-docs/field-customization + [35]: /user-docs/adding-a-field + [36]: /user-docs/adding-a-field + [37]: /user-docs/working-with-timezones + [38]: /user-docs/footer-aggregation",,baserow_user_docs,https://baserow.io/user-docs/baserow-field-overview +133,Create fields,adding-a-field,Create a Baserow field for your table,"# How to create fields in Baserow + +Creating fields in Baserow is the foundation of database design; defining your data structure determines what information you can capture, how you organize records, and what insights you can extract from your tables. + +This guide explains how to add new fields to your tables, including field creation methods, adding descriptions, duplicating fields, and best practices for field naming and organization. + +For a comprehensive overview of all available field types and their capabilities, see our [fields overview guide][1]. + +## Overview + +Fields define the structure of your database by specifying what types of information each column can store. Creating fields is your first step in transforming a blank table into a functional database that captures customer information, tracks projects, manages inventory, or powers any business process. + +Well-designed fields with clear names and descriptions improve team collaboration, reduce data entry errors, and make your database intuitive for new users. + + +![Fields option in Baserow][2] + + + +## Field creation methods + +Baserow offers flexible methods for adding fields. Each method supports all 25+ field types, letting you build exactly the data structure your workflow requires. + +| Method | Best for | Field configuration | +|--------|----------|-------------------| +| **Add at end** | Building new tables from scratch | Configure from scratch | +| **Insert between** | Adding to established table structure | Configure from scratch | +| **[In the row detail panel][3]** | Dedicated interface for a single row | Configure from scratch | +| **Duplicate field** | Creating similar fields with same type | Inherits settings, optional data copy | + +### How to create a field at the end of your table + +Add new fields quickly by appending them to the end of your table's existing field structure. Use this creation method when building a new table from scratch, adding supplementary fields to an established structure, or quick field creation when order doesn’t matter initially. + +**To create a field:** + +1. Open your table in Grid or Form view +2. Scroll to the right until you see the **+ button** after your last visible field +3. Click the **+ button** to open the field creation panel +4. Select a **field type** from the dropdown (text, number, date, etc.) +5. Enter a **field name** that clearly describes what data belongs in this field +6. Click **Create** to add the field immediately + +The new field appears at the end of your table, and you can begin entering data or configure additional field settings through the field menu. + +> After creating a field, you can [reorder it][4] by dragging the field header to your preferred position. + +### How to insert a field between existing fields + +Insert new fields at specific positions in a Grid view to maintain logical field order in established tables. Use this creation method when maintaining logical field grouping in mature tables, positioning related fields together, or following a specific data entry workflow. + +**To insert a field:** + +1. Locate the field you want to insert next to +2. Click the **dropdown arrow** next to the field name +3. Select either **← Insert left** or **→ Insert right** from the menu +4. Configure your new field type and name in the creation panel +5. Click **Create** to add the field in the specified position + +The new field appears immediately in the chosen location, shifting other fields to accommodate it. + + + +> You cannot insert fields to the left of the [Primary field][5], which always remains as the first field in your table. + +### How to duplicate an existing field + +Save time by copying configured fields rather than recreating field settings from scratch. Use this creation method when creating multiple similar fields with identical configurations, building survey tables with repeated question types, or standardizing field formats across your database. + +**To duplicate a field:** + +1. Click the **dropdown arrow** next to the field you want to duplicate +2. Select **Duplicate field** from the menu +3. In the duplication dialog, choose whether to copy the field: + - **Without data** - Creates empty field with same configuration + - **With data** - Copies all values from the original field +4. Modify the field name if needed +5. Click **Duplicate** to add the duplicated field + +The duplicated field inherits all settings from the original, including field type, format options, validations, and descriptions. This is particularly useful when creating multiple similar fields like ""Q1 Revenue,"" ""Q2 Revenue,"" ""Q3 Revenue."" + + +**Use case:** When building a survey table with multiple rating questions, duplicate your first configured rating field to maintain consistent 1-5 scales and display settings across all rating fields. + +### Add field in row detail panel + +While viewing an expanded row, you can create new fields without closing the panel. This allows you to experiment with different field types while maintaining context on the current record. + + +## How to add field descriptions + +Field descriptions provide context about what data belongs in each field, improving data quality and team collaboration. + +**To add a description:** + +1. Click on the **field name** to open the field settings menu +2. Click the **+ Add description** button in the settings panel +3. Enter a clear, concise description in the text box +4. Click **Save** to store the description + +Descriptions appear when users hover over the field name or open the field settings, helping team members understand data requirements without asking questions. + +**Example of a good field description:** +``` +Field name: Project Budget +Description: Enter the total approved budget in USD. Include all costs (labor, materials, overhead). Use whole numbers without currency symbols. +``` + +**Best practices for field descriptions:** +- Specify the data format expected (e.g., ""MM/DD/YYYY format"") +- Define units or currency (e.g., ""in USD,"" ""in hours"") +- Clarify required vs. optional fields +- Provide examples for complex fields (e.g., ""Example: +1-555-123-4567"") +- Explain business rules or validation (e.g., ""Must not exceed approved budget"") + +![How to add field descriptions image in Baserow][6] + + + + +## Frequently asked questions + +### Can I change a field type after creating it? + +Yes, click the field dropdown and select ""Edit field"" to change the field type. Baserow attempts to convert existing data to the new type, but some conversions may result in data loss (e.g., converting text containing letters to a number field). Always review your data after changing field types. + +### What happens when I duplicate a field with data? + +The duplicated field contains an exact copy of all values from the original field at the time of duplication. Changes to either field afterward don't affect the other; they're independent copies. This is useful for creating backups before major data transformations. + +### Can I create fields in views other than Grid View? + +Field creation is available directly in Grid and Form View, and row detail modal in other view types. However, once created, fields appear across all view types (Gallery, Kanban, Calendar, etc.) according to each view's configuration. You can hide fields in specific views without deleting them. + +### Is there a limit to how many fields I can create? + +Baserow doesn't enforce a strict field limit, but practical performance considerations suggest keeping tables under 200 fields. For better organization and performance, consider splitting very wide tables into related tables connected with [link to table fields][8]. + +### What's the difference between field names and field descriptions? + +Field names are short labels displayed in table headers and must be unique within a table. Field descriptions provide detailed context about data requirements and appear when hovering or clicking the field. Use names for identification and descriptions for guidance. + +### Can I create computed fields that calculate automatically? + +Yes, several field types compute values automatically: [Formula][9] fields calculate based on other fields in the same row, [Lookup][10] fields pull data from linked tables, [Count][11] fields tally linked rows, and [Rollup][12] fields aggregate linked data. Create these fields the same way, then configure their computation rules. + +![Fields and rows in Baserow Grid View][7] + +## Related content + +- [Fields overview][1] - Learn about all 25+ field types available +- [Field configuration options][4] - Customize field behavior and appearance +- [Primary field][5] - Understand the special first field in every table +- [Link to table field][8] - Create relationships between tables +- [Formula fields][9] - Build calculated fields with formulas +- [Field customization][4] - Sort, filter, hide, and reorder fields + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](https://baserow.io/contact) for questions about Baserow or help with your account + + + [1]: /user-docs/baserow-field-overview + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/d0aeed55-5b39-4a09-9701-7b24b6c826c4/Fields%20option%20in%20Baserow.jpg + [3]: https://baserow.io/user-docs/enlarging-rows + [4]: /user-docs/field-customization + [5]: /user-docs/primary-field + [6]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/e3a79de4-3f5d-4c9b-ba4e-40c28759d70c/Field%20descriptions.jpg + [7]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/f7ccdd55-380f-4385-b577-63f1c3a49bde/Fields.jpg + [8]: /user-docs/link-to-table-field + [9]: /user-docs/understanding-formulas + [10]: /user-docs/lookup-field + [11]: /user-docs/count-field + [12]: /user-docs/rollup-field",,baserow_user_docs,https://baserow.io/user-docs/adding-a-field +134,Rows overview,overview-of-rows,Rows overview in Baserow,"# Rows overview + +Rows are individual records in your Baserow tables, each containing data across multiple fields. Learn how rows organize information, understand row IDs and counts, and discover common row operations. + + + +## Overview + +A row represents a single record or entry in your table. Rows are the fundamental building blocks where your information lives, and understanding how to work with them is essential for effective data management in Baserow. + +Rows hold your actual data records, while fields (columns) define what type of information each record contains. Each row spans horizontally across your table, with cells at the intersection of rows and fields containing the actual data values. + +![Row structure in a Baserow table](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/Screenshot_2022-06-14_at_20.23.05.png) + +In the image above, each horizontal line represents a complete row with information about a project in the ""All Projects"" table. + +## Understanding table structure + +Baserow tables organize data in a grid structure where rows and fields work together to create a complete database. + +**Rows (horizontal):** Each row represents one complete record with all its associated information. For example, in a customer database, one row contains all details about a single customer: their name, email, phone number, and purchase history. Data in rows reads from left to right across fields. + +**Fields (columns):** Fields define the categories of information your records contain. The ""Name"" field, ""Email"" field, and ""Phone"" field are vertical columns where similar types of data appear for every row. Data in fields is read from top to bottom across rows. + +**Cells:** The intersection of a row and a field creates a cell, which holds the actual data value. If row 7 intersects with the ""Name"" field, that cell contains the name value for that specific record. Each cell stores one piece of information according to its field type. + + + +![Cell location example](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/Screenshot_2022-06-08_at_10.36.19.png) + +The cell containing ""Valery Dugall"" sits at the intersection of row 7 and the Name field. + + + +## Row identifiers vs. row count + +Understanding the difference between row IDs and row counts helps you track and reference records correctly. + +Click the row number column header to toggle between row ID (with potential gaps) and row count (sequential without gaps). This doesn't change the underlying data, just how row numbers display. + +### What is a row identifier? + +Row ID is a permanent, unique number assigned when a row is created. This number never changes and stays with that row forever, even if you reorder rows or delete other rows. Row IDs are not sequential after deletions; if you delete row 5, you'll see rows 1, 2, 3, 4, 6, 7 with a gap where row 5 was. This permanence makes row IDs reliable for references, formulas, and integrations that need to identify specific records consistently. + +**Use row IDs when:** Creating formulas that reference specific rows, building integrations that track records over time, maintaining permanent references that won't change with row reordering, or using the `row_id()` [formula function](/user-docs/understanding-formulas) to identify records. + +### What is a row count? + +Row count provides sequential numbering of currently visible rows without gaps. This number changes as you add, delete, or filter rows. If you have 100 rows and delete row 50, row count renumbers everything sequentially from 1 to 99. Row count helps you quickly see how many rows exist and provides a simple sequential reference for temporary purposes. + +**Use row count when:** Counting total visible rows in your current view, creating temporary sequential references, printing or exporting with simple numbering, or needing gap-free numbering for presentations. + +![Switching between row ID and row count](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/0d002039fbd46687b129f79701286b2313493502.webp) + + +## Working with rows + +Rows support various operations that help you manage and organize your data effectively. + +### Creating rows + +You can create rows manually one at a time, import multiple rows from CSV or other files, use forms to let others create rows, or utilize the API for programmatic row creation. Learn more: [Create rows](/user-docs/how-to-make-new-rows) + +### Editing rows + +You can edit cells inline for quick updates, open the row detail panel for comprehensive editing of all fields in one row, paste data from spreadsheets for bulk updates, or use multi-cell selection to update multiple values efficiently. Learn more: [Edit rows](/user-docs/navigating-row-configurations) + +### Selecting rows + +[Row selection](/user-docs/paste-data-into-baserow-table) enables bulk editing, deletion, copying data across rows, or applying operations to multiple records simultaneously. + +### Deleting rows + +[Deleted rows](/user-docs/navigating-row-configurations) move to trash with a [grace period for recovery][1]. Be cautious when deleting; once the trash grace period expires, deletion is permanent. + +### Row coloring and organization + +Apply colors to rows based on conditions or manually to create visual organization. Use [row coloring](/user-docs/row-coloring) for status indication, priority highlighting, categorization, or any visual grouping that helps you quickly scan and understand your data. + +### Row comments and collaboration + +Add [comments to rows](/user-docs/row-commenting) to discuss specific records with team members, mention collaborators with @ tags, track conversation history about individual records, or document decisions and changes related to specific rows. + +### Date dependency + +Dependencies work across rows within the same table, helping maintain logical schedules without manual date adjustments. Configure relationships between rows where dates automatically adjust based on dependencies. + +When you reschedule a parent row, all dependent child rows shift their dates proportionally, maintaining the original time relationships. This is useful for project management where task delays cascade through dependent activities. + +Learn more: [Date dependency][4] + + + + + +## Common row operations + +**Filtering rows:** Use [filters](/user-docs/filters-in-baserow) to show only rows matching specific criteria. Filters don't delete data; they temporarily hide rows that don't meet your conditions. This is perfect for focusing on relevant subsets like ""Active Customers"" or ""Tasks Due This Week."" + +**Sorting rows:** Arrange rows by field values in ascending or descending order. Sort alphabetically by name, chronologically by date, numerically by price, or by any field type. Sorting changes display order without affecting row IDs. + +**Grouping rows:** [Group rows](/user-docs/group-rows-in-baserow) by field values to organize records into collapsible sections. Group by status, category, assignee, or any single-select field to create organized sections within your table. + +**Expanding rows:** [Increase row height](/user-docs/navigating-row-configurations#configure-row-height) to see more content in long text fields, view multiple lines of wrapped text, display larger images in file fields, or get better visibility of cell contents without clicking into them. + +**Tracking changes:** View [row change history](/user-docs/row-change-history) to see who modified rows and when, review previous values before edits, track data evolution over time, or audit changes for compliance purposes. + + + +## Frequently asked questions + +### What's the maximum number of rows I can have in a table? + +Baserow has row limits depending on your [subscription plan][2]. Limits depend on your plan's storage capacity and performance requirements for your specific use case. Tables can handle millions of rows efficiently thanks to lazy loading, which loads data progressively as you scroll rather than loading everything at once. + +### Why can't I select more than 200 rows at once? + +The 200-row selection limit exists because Baserow loads rows in batches of 200 as you scroll through tables. This lazy loading approach allows smooth scrolling through millions of rows without downloading entire tables. If you need to operate on more than 200 rows, use filters to create smaller batches or use the API for bulk operations. + +### Can I change a row's ID after it's created? + +No, row IDs are permanent identifiers that cannot be changed or reassigned. This permanence ensures reliable references in formulas, integrations, and links between tables. If you need changeable identifiers, create a custom field (like an [auto-number field][3]) for your own numbering system. + +### What happens to row IDs when I delete rows? + +Deleted row IDs are never reused. If you delete row 5, that number remains permanently unused even if you create new rows later. This prevents confusion where different records might share the same ID at different times. Row count renumbers to fill gaps, but row ID preserves the gap. + +### How do I reference specific rows in formulas? + +Use the `row_id()` [formula function](/user-docs/understanding-formulas) to get the current row's ID. For more complex references between rows or tables, use Link to table fields with lookup or rollup fields to pull data from related records. Row IDs provide stable references that persist through sorting and filtering. + + + +## Related content + +**Work with rows effectively:** +- **[Create rows](/user-docs/how-to-make-new-rows)** – Add new records to your tables +- **[Paste data into cells](/user-docs/paste-data-into-baserow-table)** – Bulk update row data +- **[Row configuration](/user-docs/navigating-row-configurations)** – Advanced row settings + +**Organize and customize:** +- **[Row coloring](/user-docs/row-coloring)** – Add visual organization with colors +- **[Row comments](/user-docs/row-commenting)** – Collaborate on specific records +- **[Enlarge rows](/user-docs/enlarging-rows)** – See more content at once + +**Advanced features:** +- **[Filter rows](/user-docs/filters-in-baserow)** – Show only relevant data +- **[Group rows](/user-docs/group-rows-in-baserow)** – Organize by categories +- **[Row change history](/user-docs/row-change-history)** – Track modifications + +**Learn more:** +- **[Understanding formulas](/user-docs/understanding-formulas)** – Use row_id() and other functions +- **[Rows vs. columns explained](https://baserow.io/blog/rows-vs-columns-core-differences-explained)** – Deeper dive into table structure + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account. + + + [1]: https://baserow.io/user-docs/data-recovery-and-deletion + [2]: https://baserow.io/pricing + [3]: https://baserow.io/user-docs/autonumber-field +![Date dependency image][5] + [4]: https://baserow.io/user-docs/date-and-time-fields + [5]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/3653c029-8fb7-4ab1-aace-8824cb43385b/date_dependency.png",,baserow_user_docs,https://baserow.io/user-docs/overview-of-rows +135,Make,make,Integrate Baserow with Make,"# Configure Baserow in Make (formerly Integromat) + +Connect Baserow to Make to automate workflows across 1000+ apps without code. Create database tokens for secure authentication, then use Make modules to watch, create, update, delete, and list rows through visual automation scenarios. + +## Overview + +Make (formerly Integromat) enables you to build automated workflows that connect Baserow with over 1000 applications and services. With Make's visual interface, you can create custom automation scenarios that respond to triggers in Baserow, such as new rows being created, and perform actions like updating records, sending notifications, or syncing data across platforms. No coding required. + +Unlike basic integrations, Make allows complex multi-step workflows with conditional logic, data transformations, and error handling, all configured through an intuitive drag-and-drop interface. + +![Make scenario with Baserow module][1] + +## What you'll need + +- A [Baserow][2] account +- A [Make](https://www.make.com/) account +- A Baserow database token + +## Supported operations in Make + +Make's Baserow integration provides three types of operations: + +| Operation type | Available modules | Use case | +|---------------|-------------------|----------| +| **Triggers** | Watch Created Rows | Start workflows when new data appears in Baserow | +| **Actions** | Create Row, Get Row, Update Row, Delete Row, Make API Call | Modify Baserow data from other apps | +| **Searches** | List Rows | Find and retrieve specific records | + +### Triggers +- [Watch Created Rows](#watch-created-rows) - Trigger when new rows are created + +### Actions + - [Create a Row](#create-a-row) - Creates a new row + - [Get a Row](#get-a-row) - Finds a single row in a given table + - [Delete a Row](#delete-a-row) - Deletes an existing row + - [Update a Row](#update-a-row) - Updates an existing row + - [Make an API Call](#make-an-api-call) - Performs an authorized API call + - Upload a File + +### Searches + - [List Rows](#list-rows) - Finds a page of rows in a given table + +> **Alternative:** Use the Webhook module for instant triggers. Learn how to [create webhooks in Baserow](/user-docs/webhooks). + +## How to connect Baserow to Make + +### Step 1: Create a Baserow database token + +[Database tokens][3] provide secure, scoped access to your Baserow data without exposing your main account credentials. Each token can be limited to specific workspaces. + +> ⚠️ **Security note:** Database tokens function like passwords. Keep them confidential, never share them publicly, and store them securely. + +### Step 2: Create a connection in Make + +1. Log in to Make and open your scenario +2. Add a Baserow module, then click **Add** next to the *Connection* field +3. (Optional) Enter a custom connection name or keep the default +4. Enter your **Baserow API URL**: + - Cloud users: `https://api.baserow.io` + - Self-hosted: Use your custom URL (find it in [your API documentation](/api-docs)) +5. Paste the database token from Step 1 +6. Click **Save** + +![Watch Baserow created rows in Make][4] + +You can now add Baserow modules to your scenario. Manage all connections in Make's **Connections** section. + +## Baserow modules reference + +### Watch Created Rows + +Monitors a table and triggers your scenario whenever new rows are created or existing rows are updated. + +**Configuration:** + +| Field | Description | +|-------|-------------| +| Connection | Select your Baserow connection | +| Table ID | Enter your [Table ID](/user-docs/database-and-table-id) (found by clicking the three dots next to the table name) | + +**Setup steps:** +1. Add the **Watch Created Rows** module to your scenario +2. Select your connection +3. Enter or map the Table ID +4. Click **OK** and **Run once** to test + +### Create a Row + +Adds a new row to a specified Baserow table. + +**Configuration:** + +| Field | Description | +|-------|-------------| +| Connection | Select your Baserow connection | +| Table ID | Enter your [Table ID](/user-docs/database-and-table-id) | +| Row data | Map values to fields (see [permitted field types](/user-docs/baserow-field-overview)) | + +**Setup steps:** +1. Add the **Create a Row** module to your scenario +2. Select your connection and enter Table ID +3. Map data from previous modules or enter values manually + - Toggle the map icon to browse available data from previous steps + - Click any field to open the mapping panel +4. Click **OK** and **Run once** to test + +### Get a Row + +Retrieves a single row by its unique identifier. + +**Configuration:** + +| Field | Description | +|-------|-------------| +| Connection | Select your Baserow connection | +| Table ID | Enter your [Table ID](/user-docs/database-and-table-id) | +| Row ID | Enter the [Row ID](/user-docs/overview-of-rows#what-is-a-row-identifier) to retrieve | + +**Setup steps:** +1. Add the **Get a Row** module +2. Configure connection and Table ID +3. Enter or map the Row ID +4. Click **OK** and **Run once** to test + +### Update a Row + +Modifies an existing row by its ID. + +**Configuration:** + +| Field | Description | +|-------|-------------| +| Connection | Select your Baserow connection | +| Table ID | Enter your [Table ID](/user-docs/database-and-table-id) | +| Row ID | Enter the [Row ID](/user-docs/overview-of-rows#what-is-a-row-identifier) to update | +| Row data | Map new values to fields (see [permitted field types](/user-docs/baserow-field-overview)) | + +**Setup steps:** +1. Add the **Update a Row** module +2. Configure connection, Table ID, and Row ID +3. Map or enter updated field values +4. Click **OK** and **Run once** to test + +### Delete a Row + +Permanently removes a row by its ID. + +**Configuration:** + +| Field | Description | +|-------|-------------| +| Connection | Select your Baserow connection | +| Table ID | Enter your [Table ID](/user-docs/database-and-table-id) | +| Row ID | Enter the [Row ID](/user-docs/overview-of-rows#what-is-a-row-identifier) to delete | + +**Setup steps:** +1. Add the **Delete a Row** module +2. Configure connection, Table ID, and Row ID +3. Click **OK** and **Run once** to test + +### List Rows + +Retrieves multiple rows from a table with optional filtering. + +**Configuration:** + +| Field | Description | +|-------|-------------| +| Connection | Select your Baserow connection | +| Table ID | Enter your [Table ID](/user-docs/database-and-table-id) | +| Limit | Maximum rows per execution (default: 10) | +| Search | Optional: Enter a query to filter results (leave empty to return all rows) | + +**Setup steps:** +1. Add the **List Rows** module +2. Configure connection and Table ID +3. Set your limit and search parameters +4. Click **OK** and **Run once** to test + +### Make an API Call + +Execute custom API requests for advanced operations not covered by standard modules. + +**Configuration:** + +| Field | Description | +|-------|-------------| +| Connection | Select your Baserow connection | +| URL | Enter a path relative to your API URL (e.g., `/api/database/fields/table/{table_id}`) | +| Method | Select HTTP method: GET, POST, PUT, PATCH, or DELETE | +| Headers | Optional: Add custom headers (authorization included automatically) | +| Query String | Optional: Add query parameters (e.g., `filter__field_1__equal` = `test`) | +| Body | Optional: Add request body content | + +**Setup steps:** +1. Add the **Make an API Call** module +2. Configure your endpoint and method +3. Review the [Baserow API documentation](/api-docs) for available endpoints +4. Click **OK** and **Run once** to test + +![Baserow API docu][5] + +## Frequently asked questions + +### How do I find my Table ID? + +Click the three dots (⋮) next to your table name in Baserow. The ID appears in brackets in the menu. Learn more about [database and table IDs](/user-docs/database-and-table-id). + +### Can I use Make with self-hosted Baserow? + +Yes. When creating your connection in Make, replace `https://api.baserow.io` with your self-hosted Baserow URL. Find your exact URL in your [API documentation](https://baserow.io/user-docs/database-api). + +### What happens if my database token expires? + +Database tokens don't expire automatically. If you delete a token or it stops working, create a new one and update your Make connection in the Connections section. + +### How do I trigger workflows instantly instead of polling? + +Use Baserow's webhook functionality instead of the ""Watch Created Rows"" trigger. Webhooks push data to Make immediately when events occur. See [Baserow webhooks documentation](/user-docs/webhooks). + +### Can I filter which rows trigger my scenario? + +Yes. Use the List Rows module with search parameters, or add filters within your Make scenario after retrieving rows. The search field accepts queries to match specific cell data. + +## Related content + +**Learn more about Baserow integrations:** +- [Webhooks in Baserow](/user-docs/webhooks) +- [Database tokens](/user-docs/personal-api-tokens) +- [Database API documentation](/user-docs/database-api) +- [Zapier integration](/user-docs/zapier) +- [n8n integration](/user-docs/n8n) + +**Automation tutorials:** +- [How to generate content with OpenAI's GPT-3 and Baserow](/blog/generate-idea-openai-baserow) +- [How to Build a Custom CMS with Baserow and Webflow](/blog/build-custom-cms-baserow-webflow) +- [How to Automatically Save Email Attachments to a Database](/blog/save-email-attachments-to-a-database) + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/f94c7320-e398-47e0-ae2d-74c8adbe9e84/make%20scenario.jpg + [2]: https://baserow.io + [3]: https://baserow.io/user-docs/personal-api-tokens + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/4f8e4969-4839-4c0a-9a7b-7def2a5c108c/Watch%20Baserow%20created%20rows%20in%20Make.jpg + [5]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/86736a12-1fe7-43ae-ba42-2a84e0b1279b/API%20doc.jpg",,baserow_user_docs,https://baserow.io/user-docs/make +136,Working with timezones,working-with-timezones,Working with timezones in Baserow,"# Working with timezones in Baserow + +Timezone support in Baserow enables seamless global collaboration; ensuring teams across continents see dates in their local time or share a unified time reference, preventing scheduling conflicts and data confusion. + +This guide explains how Baserow handles timezones in date fields, including displaying dates across timezones, setting timezones for collaborators, and using timezone formulas. + + + +## Overview + +Baserow stores all dates and times in Coordinated Universal Time (UTC) internally, ensuring consistent data regardless of where users are located. However, you can configure how dates display to users through timezone settings that convert UTC storage to meaningful local times. + +Timezone configuration happens at the field level, giving you flexibility to show some date fields in users' local timezones while displaying others in a specific shared timezone. This dual approach supports both global coordination (meeting times displayed in each user's timezone) and location-specific requirements (store hours always shown in the store's timezone). + +Understanding timezone handling prevents common pitfalls like scheduling meetings at the wrong time, misinterpreting deadlines across time zones, or displaying confusing date values to international teams. + +![Working with timezones in Baserow](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/4e9d182b-07de-43f4-8014-058bf7b55356/London.webp) + +## How Baserow stores and displays dates + +### Internal storage (UTC) + +All dates are stored in UTC regardless of your timezone or how dates display in your tables. This universal storage format ensures: + +- **Data consistency:** The same stored value represents the same moment worldwide +- **Accurate calculations:** Time differences and date arithmetic work correctly +- **Import/export reliability:** Data transfers preserve exact timestamps +- **API integration:** External systems receive standardized UTC values + +### Display format (configured per field) + +While storage uses UTC, display can show dates in two ways based on [date field configuration][field-config]: + +**User's local timezone (default):** +- Each collaborator sees dates converted to their device's timezone +- A meeting at ""3:00 PM"" appears as 3 PM in New York, 8 PM in London, 9 AM in Tokyo +- Best for: Collaborative scheduling, deadline tracking, global event management + +**Fixed timezone for all users:** +- All collaborators see dates in the same specified timezone regardless of location +- A store opening at ""9:00 AM Pacific"" shows as 9 AM Pacific for everyone +- Best for: Location-specific times, business hours, regional events + +![Displaying dates in different timezones](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/358abe1d-e7f0-4e81-92ee-935c4593125b/Screenshot_2023-03-08_at_14.32.57.png) + +## Timezone configuration methods + +| Method | Complexity | Use case | Applies to | +|--------|------------|----------|-----------| +| **Field setting** | Consistent timezone for entire field | All rows in that field | +| **Formula (`todate_tz`)** | Dynamic timezone based on conditions | Calculated per row | +| **User's local time** | Show times in each user's timezone | Default behavior | + +## How to set a timezone for a date field + +Configure a specific timezone that all collaborators will see for a particular date field. + +**To set a fixed timezone:** + +1. Click the **dropdown arrow** next to your date field name +2. Select **Edit field** from the menu +3. In the field configuration panel, enable **Set timezone for all collaborators** +4. Select your desired timezone from the dropdown (e.g., ""America/New_York,"" ""Europe/London"") +5. Click **Save** to apply the timezone + +![Setting timezone in date field configuration](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/bcdfa752-0ce8-4759-b7af-0189621f3cfb/Screenshot_2023-03-31_at_01.31.18.png) + +The default timezone is GMT/UTC. After setting a timezone, all users see dates in that timezone regardless of their location. + +**Example:** Set your ""Store Opening Time"" field to ""America/Los_Angeles"" so all team members see Pacific Time, whether they're in California, New York, or Tokyo. + +## How to use timezone formulas + +Use the `todate_tz` formula function to display dates in different time zones based on row-specific conditions or to create multiple timezone representations. Returns the first argument converted into a date, given a date format string as the second argument and the timezone provided as the third argument. + +### todate_tz function syntax +``` +todate_tz('date_value', 'format', 'timezone') +``` + +**Parameters:** +- **date_value:** Date string or field reference to convert +- **format:** Date format pattern (see [date format guide][1]) +- **timezone:** Target timezone (see [supported timezones](#supported-timezones)) + +**Example formulas:** +``` +// Convert a date string to Amsterdam time +todate_tz('20210101', 'YYYYMMDD', 'Europe/Amsterdam') + +// Convert a field value to Tokyo time +todate_tz(field('Event Date'), 'YYYY-MM-DD', 'Asia/Tokyo') + +// Conditional timezone based on region field +if(field('Region')='Europe', + todate_tz(field('Date'), 'YYYY-MM-DD', 'Europe/London'), + todate_tz(field('Date'), 'YYYY-MM-DD', 'America/New_York')) +``` + +### Use cases for timezone formulas + +**Multi-region operations:** Display event times in regional headquarters' timezones based on a region field. + +**Timezone conversion tables:** Create fields showing the same time in multiple timezones (Event Time UTC, Event Time EST, Event Time JST). + +**Historical data migration:** Convert dates from old systems that used different timezone conventions. + +**Compliance requirements:** Show audit timestamps in specific regulatory timezones while storing in UTC. + +## Timezone behavior with filters and exports + +### Filtering by date with timezones + +When using [date filters][2], Baserow evaluates based on the configured timezone: + +- **Field with user's local time:** Filter evaluates against the user's current timezone +- **Field with fixed timezone:** Filter evaluates against that timezone +- **UTC field:** Filter evaluates against UTC + +This ensures ""show me today's appointments"" returns correct results regardless of timezone configuration. + +### Exporting dates with timezones + +**Copy and paste:** +- If **Show timezone** is enabled in field configuration, copied values include timezone offset +- Example: ""2025-01-15 14:00:00 EST"" instead of ""2025-01-15 14:00:00"" + +**CSV/Excel export:** +- Exported dates include timezone information if configured +- Format depends on the field's timezone and format settings +- Import tools can preserve timezone data for round-trip integrity + +## Common timezone scenarios + +### Scenario 1: Global team scheduling +**Challenge:** Schedule a meeting for team members in New York, London, and Tokyo. + +**Solution:** Use a date field with the user's local time (default). Enter ""2:00 PM EST"" and each person sees it in their local time: 2 PM EST, 7 PM GMT, 3 AM JST. + +### Scenario 2: Store operating hours +**Challenge:** Display consistent store hours for retail locations regardless of where employees are viewing. + +**Solution:** Set field timezone to store's timezone (e.g., ""America/Chicago""). All employees see ""9:00 AM - 6:00 PM Central"" regardless of their location. + +### Scenario 3: Multi-region event management +**Challenge:** The Company has events in multiple regions, each needing a local time display. + +**Solution:** Use `todate_tz` formula with the region field to display the appropriate timezone per event. + +### Scenario 4: Historical timestamp auditing +**Challenge:** Compliance requires showing when actions occurred in a specific regulatory timezone. + +**Solution:** Create a formula field converting the Created On field to the regulatory timezone using `todate_tz`. + +## Frequently asked questions + +### What happens if I change a field's timezone setting? + +Baserow recalculates the display for all dates in that field immediately. The underlying UTC storage never changes; only the display conversion changes. This means you can switch timezones freely without losing data accuracy. + +### Can I have different timezones for different views of the same table? + +No, timezone configuration is field-level, not view-level. All views show the same timezone for a given field. To display multiple timezones simultaneously, create separate formula fields using `todate_tz` for each timezone needed. + +### How does Baserow handle daylight saving time changes? + +Baserow uses the IANA timezone database which includes DST rules for all supported timezones. Dates automatically adjust for DST transitions; a meeting scheduled for ""2:00 PM Eastern"" displays correctly whether during EST or EDT. + +### What timezone is used when I create a new date field? + +By default, new date fields use the user's device timezone (detected automatically from browser settings). You can immediately change this to a fixed timezone or leave it as user-local based on your needs. + +### Can I use timezone formulas in date fields or only in formula fields? + +The `todate_tz` function works only in formula fields. Regular date fields use the timezone setting in their configuration panel. For dynamic timezone behavior, create a formula field that references your date field. + +### What happens to time zones when importing data? + +During CSV/Excel import, specify if your data includes timezone information. Baserow attempts to parse timezone offsets and convert to UTC storage. If no timezone is specified, Baserow assumes UTC or prompts you to specify the source timezone. + +### Can I display different time zones for dates in the same field? + +Baserow can’t display different time zones for dates in the same field. A date field uses the same timezone for all values. By default, this will be the browser’s timezone unless you specify one in the settings. A date field requires a single timezone to function properly. + +## Supported timezones + +Baserow supports all standard IANA timezone identifiers. Select from the timezone dropdown in field configuration or reference them in `todate_tz` formulas. + + +
+Click to view complete list of supported timezones + +### Africa +Africa/Abidjan, Africa/Accra, Africa/Addis_Ababa, Africa/Algiers, Africa/Asmara, Africa/Bamako, Africa/Bangui, Africa/Banjul, Africa/Bissau, Africa/Blantyre, Africa/Brazzaville, Africa/Bujumbura, Africa/Cairo, Africa/Casablanca, Africa/Ceuta, Africa/Conakry, Africa/Dakar, Africa/Dar_es_Salaam, Africa/Djibouti, Africa/Douala, Africa/El_Aaiun, Africa/Freetown, Africa/Gaborone, Africa/Harare, Africa/Johannesburg, Africa/Juba, Africa/Kampala, Africa/Khartoum, Africa/Kigali, Africa/Kinshasa, Africa/Lagos, Africa/Libreville, Africa/Lome, Africa/Luanda, Africa/Lubumbashi, Africa/Lusaka, Africa/Malabo, Africa/Maputo, Africa/Maseru, Africa/Mbabane, Africa/Mogadishu, Africa/Monrovia, Africa/Nairobi, Africa/Ndjamena, Africa/Niamey, Africa/Nouakchott, Africa/Ouagadougou, Africa/Porto-Novo, Africa/Sao_Tome, Africa/Tripoli, Africa/Tunis, Africa/Windhoek + +### Americas +America/Adak, America/Anchorage, America/Anguilla, America/Antigua, America/Araguaina, America/Argentina/Buenos_Aires, America/Argentina/Catamarca, America/Argentina/Cordoba, America/Argentina/Jujuy, America/Argentina/La_Rioja, America/Argentina/Mendoza, America/Argentina/Rio_Gallegos, America/Argentina/Salta, America/Argentina/San_Juan, America/Argentina/San_Luis, America/Argentina/Tucuman, America/Argentina/Ushuaia, America/Aruba, America/Asuncion, America/Atikokan, America/Bahia, America/Bahia_Banderas, America/Barbados, America/Belem, America/Belize, America/Blanc-Sablon, America/Boa_Vista, America/Bogota, America/Boise, America/Cambridge_Bay, America/Campo_Grande, America/Cancun, America/Caracas, America/Cayenne, America/Cayman, America/Chicago, America/Chihuahua, America/Costa_Rica, America/Creston, America/Cuiaba, America/Curacao, America/Danmarkshavn, America/Dawson, America/Dawson_Creek, America/Denver, America/Detroit, America/Dominica, America/Edmonton, America/Eirunepe, America/El_Salvador, America/Fort_Nelson, America/Fortaleza, America/Glace_Bay, America/Godthab, America/Goose_Bay, America/Grand_Turk, America/Grenada, America/Guadeloupe, America/Guatemala, America/Guayaquil, America/Guyana, America/Halifax, America/Havana, America/Hermosillo, America/Indiana/Indianapolis, America/Indiana/Knox, America/Indiana/Marengo, America/Indiana/Petersburg, America/Indiana/Tell_City, America/Indiana/Vevay, America/Indiana/Vincennes, America/Indiana/Winamac, America/Inuvik, America/Iqaluit, America/Jamaica, America/Juneau, America/Kentucky/Louisville, America/Kentucky/Monticello, America/Kralendijk, America/La_Paz, America/Lima, America/Los_Angeles, America/Lower_Princes, America/Maceio, America/Managua, America/Manaus, America/Marigot, America/Martinique, America/Matamoros, America/Mazatlan, America/Menominee, America/Merida, America/Metlakatla, America/Mexico_City, America/Miquelon, America/Moncton, America/Monterrey, America/Montevideo, America/Montreal, America/Montserrat, America/Nassau, America/New_York, America/Nipigon, America/Nome, America/Noronha, America/North_Dakota/Beulah, America/North_Dakota/Center, America/North_Dakota/New_Salem, America/Nuuk, America/Ojinaga, America/Panama, America/Pangnirtung, America/Paramaribo, America/Phoenix, America/Port-au-Prince, America/Port_of_Spain, America/Porto_Velho, America/Puerto_Rico, America/Punta_Arenas, America/Rainy_River, America/Rankin_Inlet, America/Recife, America/Regina, America/Resolute, America/Rio_Branco, America/Santarem, America/Santiago, America/Santo_Domingo, America/Sao_Paulo, America/Scoresbysund, America/Sitka, America/St_Barthelemy, America/St_Johns, America/St_Kitts, America/St_Lucia, America/St_Thomas, America/St_Vincent, America/Swift_Current, America/Tegucigalpa, America/Thule, America/Thunder_Bay, America/Tijuana, America/Toronto, America/Tortola, America/Vancouver, America/Whitehorse, America/Winnipeg, America/Yakutat, America/Yellowknife + +### Antarctica +Antarctica/Casey, Antarctica/Davis, Antarctica/DumontDUrville, Antarctica/Macquarie, Antarctica/Mawson, Antarctica/Palmer, Antarctica/Rothera, Antarctica/Syowa, Antarctica/Troll, Antarctica/Vostok + +### Asia +Asia/Almaty, Asia/Amman, Asia/Anadyr, Asia/Aqtau, Asia/Aqtobe, Asia/Ashgabat, Asia/Baghdad, Asia/Baku, Asia/Bangkok, Asia/Barnaul, Asia/Beirut, Asia/Bishkek, Asia/Brunei, Asia/Chita, Asia/Choibalsan, Asia/Colombo, Asia/Damascus, Asia/Dhaka, Asia/Dili, Asia/Dubai, Asia/Dushanbe, Asia/Gaza, Asia/Hebron, Asia/Ho_Chi_Minh, Asia/Hong_Kong, Asia/Hovd, Asia/Irkutsk, Asia/Jakarta, Asia/Jayapura, Asia/Jerusalem, Asia/Kabul, Asia/Kamchatka, Asia/Karachi, Asia/Kathmandu, Asia/Khandyga, Asia/Kolkata, Asia/Krasnoyarsk, Asia/Kuala_Lumpur, Asia/Kuching, Asia/Macau, Asia/Magadan, Asia/Makassar, Asia/Manila, Asia/Nicosia, Asia/Novokuznetsk, Asia/Novosibirsk, Asia/Omsk, Asia/Oral, Asia/Pontianak, Asia/Pyongyang, Asia/Qatar, Asia/Qyzylorda, Asia/Riyadh, Asia/Sakhalin, Asia/Samarkand, Asia/Seoul, Asia/Shanghai, Asia/Singapore, Asia/Srednekolymsk, Asia/Taipei, Asia/Tashkent, Asia/Tbilisi, Asia/Tehran, Asia/Thimphu, Asia/Tokyo, Asia/Tomsk, Asia/Ulaanbaatar, Asia/Urumqi, Asia/Ust-Nera, Asia/Vladivostok, Asia/Yakutsk, Asia/Yekaterinburg, Asia/Yerevan + +### Atlantic +Atlantic/Azores, Atlantic/Bermuda, Atlantic/Canary, Atlantic/Cape_Verde, Atlantic/Faroe, Atlantic/Madeira, Atlantic/Reykjavik, Atlantic/South_Georgia, Atlantic/Stanley + +### Australia +Australia/Adelaide, Australia/Brisbane, Australia/Broken_Hill, Australia/Currie, Australia/Darwin, Australia/Eucla, Australia/Hobart, Australia/Lindeman, Australia/Lord_Howe, Australia/Melbourne, Australia/Perth, Australia/Sydney + +### Europe +Europe/Amsterdam, Europe/Andorra, Europe/Astrakhan, Europe/Athens, Europe/Belgrade, Europe/Berlin, Europe/Brussels, Europe/Bucharest, Europe/Budapest, Europe/Chisinau, Europe/Copenhagen, Europe/Dublin, Europe/Gibraltar, Europe/Helsinki, Europe/Istanbul, Europe/Kaliningrad, Europe/Kiev, Europe/Kirov, Europe/Lisbon, Europe/London, Europe/Luxembourg, Europe/Madrid, Europe/Malta, Europe/Minsk, Europe/Monaco, Europe/Moscow, Europe/Oslo, Europe/Paris, Europe/Prague, Europe/Riga, Europe/Rome, Europe/Samara, Europe/Simferopol, Europe/Sofia, Europe/Stockholm, Europe/Tallinn, Europe/Tirane, Europe/Ulyanovsk, Europe/Uzhgorod, Europe/Vienna, Europe/Vilnius, Europe/Volgograd, Europe/Warsaw, Europe/Zaporozhye, Europe/Zurich + +### Indian Ocean +Indian/Chagos, Indian/Christmas, Indian/Cocos, Indian/Kerguelen, Indian/Mahe, Indian/Maldives, Indian/Mauritius, Indian/Reunion + +### Pacific +Pacific/Apia, Pacific/Auckland, Pacific/Bougainville, Pacific/Chatham, Pacific/Chuuk, Pacific/Easter, Pacific/Efate, Pacific/Enderbury, Pacific/Fakaofo, Pacific/Fiji, Pacific/Funafuti, Pacific/Galapagos, Pacific/Gambier, Pacific/Guadalcanal, Pacific/Guam, Pacific/Honolulu, Pacific/Kiritimati, Pacific/Kosrae, Pacific/Kwajalein, Pacific/Majuro, Pacific/Marquesas, Pacific/Nauru, Pacific/Niue, Pacific/Norfolk, Pacific/Noumea, Pacific/Pago_Pago, Pacific/Palau, Pacific/Pitcairn, Pacific/Pohnpei, Pacific/Port_Moresby, Pacific/Rarotonga, Pacific/Tahiti, Pacific/Tarawa, Pacific/Tongatapu, Pacific/Wake, Pacific/Wallis + +### Other +GMT, UTC + +
+ + + +## Related content + +- [Date and time fields][date-fields] - Learn about date field types and formatting +- [Formula field reference][formulas] - Explore all formula functions +- [Field configuration][field-config] - Customize field settings +- [Date format options][1] - Available date format patterns +- [Filters with dates][filters] - Create date-based filters + +--- + + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](https://baserow.io/contact) for questions about Baserow or help with your account + +[date-fields]: /user-docs/date-and-time-fields +[field-config]: /user-docs/field-customization +[formulas]: /user-docs/understanding-formulas +[filters]: /user-docs/filters-in-baserow + + + [1]: /user-docs/date-and-time-fields#setting-a-date-format + [2]: https://baserow.io/user-docs/filters-in-baserow",,baserow_user_docs,https://baserow.io/user-docs/working-with-timezones +137,Calendar view,guide-to-calendar-view,Using a calendar view in a Baserow table,"# Calendar view + +Calendar view displays records on a monthly calendar based on date fields, making it perfect for event planning, content calendars, deadline tracking, and any time-based workflow. + +This guide covers how to use Baserow's Calendar view to visualize and manage date-based data like events, deadlines, schedules, and appointments. + +> **Paid feature:** Calendar view requires [paid plans](/user-docs/pricing-plans). Users on the free plan cannot create Calendar views. + +Learn more about views in general: [Views overview](/user-docs/overview-of-baserow-views) + + +## What is Calendar view? + +Calendar view displays your records on a calendar grid organized by dates. Each record with a date appears as an event card on the corresponding day, giving you a visual timeline of your data. Navigate between months to see past and future records. + +**Calendar view excels at:** Event planning and management, content publishing schedules, appointment booking systems, deadline tracking, project milestones, team availability calendars, marketing campaign timelines, and any workflow where dates are the primary organizing principle. + +![Calendar view showing events organized by date](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/65a48f6f-6d66-4ef5-9a0a-90a3c87e739d/Calendar%20view.png) + +## Calendar view vs other view types + +| Feature | Calendar | Grid | Kanban | Timeline | +|---------|----------|------|--------|----------| +| **Best for** | Date-based events | Detailed data work | Status tracking | Date ranges | +| **Organization** | By calendar dates | By rows | By status columns | By start/end dates | +| **Time visualization** | ✓ Monthly/daily | Poor | Poor | ✓ Duration-based | +| **Date requirement** | Required | Optional | Optional | Required (range) | +| **Create by clicking** | ✓ Click dates | Manual entry | ✓ Click columns | ✓ Click timeline | +| **External sync** | ✓ iCal format | – | – | – | +| **Premium feature** | Yes | No | Yes | Yes | + +Learn more: [Grid view](/user-docs/guide-to-grid-view) | [Kanban view](/user-docs/guide-to-kanban-view) | [Timeline view](/user-docs/guide-to-timeline-view) + +## Create a Calendar view + +Calendar views require at least one date field to display events. Compatible date field types: + +- **[Date field](/user-docs/date-and-time-fields)** - Standard date and date-time fields +- **[Created on field](/user-docs/date-and-time-fields#created-on)** - Automatic record creation dates +- **[Last modified field](/user-docs/date-and-time-fields#last-modified-field)** - Automatic modification timestamps +- **[Formula fields](/user-docs/formula-field-overview)** - Date formulas (e.g., calculated deadlines) + +### Prerequisites + +Your table must have at least one compatible date field. If you don't have one: +1. Create a date field before creating the Calendar view +2. Optionally populate existing records with dates +3. Records without dates won't appear on the calendar + +### Create the view + +1. Click the **view dropdown** at the top-left of the table +2. Select **Calendar** from the view type options +3. Choose [Collaborative](/user-docs/collaborative-views) or [Personal](/user-docs/personal-views) permission type +4. Enter a **name** for your Calendar view +5. **Select the date field** that determines when events appear +6. Click **Create view** + +![Creating a calendar view in Baserow](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/f0bd0c21-43a6-4cef-b983-86c019aed633/Deadline_tracker.webp) + +Events appear on dates corresponding to their date field values. Records with empty date fields don't appear on the calendar. + +## Navigate the calendar + +### Month navigation + +**Arrow buttons:** Click the left/right arrows above the calendar to move between months + +**Today button:** Click **Today** to jump immediately to the current month and date + +**Search:** Use the search box to filter events and see only matching calendar cards + +### Create events by clicking + +Quickly create events directly on the calendar: + +1. **Hover over any date** on the calendar +2. A **+ button** appears on that date +3. **Click the + button** to create a new event +4. Fill in field values in the pop-up +5. Click **Create** + +The new record appears as a card on that date with the date field automatically set. + +### Edit existing events + +1. **Click any event card** on the calendar +2. The record opens in an **edit modal** +3. Modify field values as needed +4. Click **Show hidden fields** to access all fields +5. Close the modal (changes save automatically) + +**Delete events:** Right-click any event card and select **Delete** from the context menu. This permanently removes the record from your table across all views. + +## Configure calendar display + +### Change the displayed date field + +The **Displayed by [field]** button in the toolbar shows which date field currently organizes your calendar. + +**Switch date fields:** +1. Click the **calendar icon** in the toolbar +2. Select a different date field from the dropdown +3. The calendar reorganizes to show events based on the new date field + +![Changing the displayed date field](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/b10e2def-7f68-4fa7-84c0-508d1e6e27dd/change_date_field.webp) + +This lets you create multiple Calendar views of the same table showing different date perspectives (e.g., ""Start Date Calendar"" and ""Due Date Calendar""). + +### Use formula fields for dates + +Display events based on calculated dates using [Formula fields](/user-docs/formula-field-overview). This enables sophisticated calendar filtering and date calculations. + +**Common formula use cases:** +- Show only weekdays (exclude weekends) +- Calculate deadline dates from start dates +- Display events only during business hours +- Create recurring event patterns + +![Using formula fields in calendar](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/9058239f-e714-430f-b1fa-fa4b01c78056/Screenshot%202023-05-23%20at%2012.16.14.png) + +Select formula date fields from the **Displayed by** dropdown just like regular date fields. + +### Customize event labels + +Control which fields display on event cards to show the most relevant information. + +1. Click **Labels** in the toolbar +2. **Toggle fields on/off** to show or hide them on event cards +3. Use **Hide all** or **Show all** for quick bulk changes +4. **Drag the handle (⋮⋮)** to reorder fields on cards +5. Use the **search box** to quickly find fields in long lists + +![Customizing calendar event labels](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/6336f593-f28f-408d-84bb-183e68cc8812/date_field.webp) + +Green toggles (switched right) indicate visible fields. Gray toggles (switched left) indicate hidden fields. + +**Label strategy:** Show essential information like event titles, times, and assignees. Hide administrative fields like IDs or timestamps. Put the most important fields first on the cards. + +### Apply event colors + +Use [row coloring](/user-docs/row-coloring) to color-code events based on field values, making different event types or priorities immediately distinguishable. + +1. Click **Colors** in the toolbar +2. Click **Add condition** +3. Select a field and condition (e.g., ""Priority = High"") +4. Choose a color for matching events +5. Add multiple conditions with different colors + +![Applying colors to calendar events](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/812a0966-c836-4629-94c4-a10c6417652e/Screenshot%202023-05-23%20at%2012.21.07.png) + +**Color coding examples:** Red for urgent deadlines, blue for team meetings, green for completed tasks, yellow for pending reviews. + +## Sync to external calendars + +Export your Baserow calendar to external calendar applications for unified scheduling across platforms. + +### Setup calendar sync + +1. Open the Calendar view +2. Click **Share view** in the toolbar +3. Select **Sync to an external calendar** +4. **Copy the generated URL** (iCal format) +5. Open your external calendar app (Google Calendar, Outlook, Apple Calendar) +6. Find the **""Add calendar by URL""** or **""Subscribe to calendar""** option +7. **Paste the Baserow URL** +8. Save the subscription + +![Syncing to external calendar](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/2a939db4-05fe-4732-a1b0-abe4994d7193/Sync%20to%20an%20external%20calendar.jpg) + +### How calendar sync works + +**Real-time updates:** Changes in Baserow automatically sync to external calendars (may take a few minutes for updates to propagate). + +**One-way sync:** External calendars display Baserow events but changes made in external apps don't sync back to Baserow. Baserow remains the source of truth. + +**Filtered views sync:** If the Calendar view has filters applied, only matching events appear in the external calendar subscription. + +**Access control:** Anyone with the subscription URL can see calendar events. Use [collaborative/personal views](/user-docs/collaborative-views) and filters to control what data syncs externally. + +Learn more: [Connect Google Calendar to Baserow](https://baserow.io/blog/connect-google-calendar-to-baserow-calendar-view) + +## Calendar view toolbar options + +The toolbar at the top of the Calendar view provides quick access to common operations: + +**[Filter](/user-docs/filters-in-baserow)** - Show only events matching specific conditions. Useful for viewing specific event types, team members, or priority levels. + +**[Share view](/user-docs/public-sharing)** - Generate public links, embed codes, or external calendar sync URLs. + +**[Colors](/user-docs/row-coloring)** - Apply conditional formatting to highlight events (covered above). + +**Displayed by** - Change which date field organizes the calendar (covered above). + +**Labels** - Customize which fields appear on event cards (covered above). + +Each of these features has detailed documentation at the linked pages. + +## Calendar view management + +Access view management options by clicking the **three-dot menu (⋮)** next to the view name: + +- **[Duplicate view][1]** - Copy configuration to a new view +- **[Import file][2]** - Add data from CSV, JSON, or XML files +- **[Convert view type][3]** - Change between collaborative and personal +- **[Webhooks][4]** - Configure external notifications for calendar events +- **[Rename view][5]** - Update the view name +- **[Delete view][5]** - Remove the view permanently +- **[Configure date dependencies][6]** - Set up date field relationships + +Learn more: [View configuration options](/user-docs/view-customization) + +![Calendar view management options](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/ff81ccde-b08f-4238-9d5f-7b43f7f18c64/calendar_view.png) + + +## Why use Calendar view? + +Calendar view provides date-based visualization that's impossible in [Grid view](/user-docs/guide-to-grid-view) or other view types. The monthly layout makes temporal patterns and scheduling conflicts immediately visible. + +**Visual timeline clarity:** See how events distribute across days, weeks, and months. Identify busy periods, gaps in scheduling, or conflicting appointments at a glance. + +**Intuitive date management:** Click any date to create events or drag existing events to reschedule. The visual calendar matches mental models for time-based planning. + +**Month/week/day navigation:** Quickly jump between time periods using navigation controls. Return to today with one click, or browse forward to plan future activities. + +**External calendar sync:** Export calendar data to Google Calendar, Outlook, or Apple Calendar. Keep Baserow events synchronized with external scheduling tools your team already uses. + +## Frequently asked questions + +### What happens to records without dates? + +Records where the displayed date field is empty don't appear on the calendar at all. They still exist in your table and appear in other views like Grid view, but the calendar only shows records with dates. + +### Can I show events from multiple date fields simultaneously? + +No. Each Calendar view displays events based on one date field at a time. Create multiple calendar views using different date fields to see different temporal perspectives of your data (e.g., ""Start Date Calendar"" and ""End Date Calendar""). + +### How do I see events that span multiple days? + +Calendar view shows events on their date field value. For multi-day events, use [Timeline view](/user-docs/guide-to-timeline-view) instead, which displays date ranges with start and end dates. Alternatively, create separate records for each day or use formula fields to calculate relevant dates. + +### Can I change event dates by dragging them? + +Currently, the Calendar view doesn't support drag-to-reschedule functionality. To change an event's date, click the event card and edit the date field directly in the modal, or switch to Grid view for bulk date updates. + +### Does calendar sync work with all external calendar apps? + +Calendar sync uses standard iCal format, compatible with most major calendar applications including Google Calendar, Outlook, Apple Calendar, and others that support calendar subscriptions via URL. If your calendar app supports ""Subscribe to calendar by URL,"" it should work. + +### Why don't my calendar updates appear in external apps immediately? + +External calendar apps typically refresh subscribed calendars every few hours (not real-time). Google Calendar refreshes roughly every 8-12 hours. You can often manually force a refresh in your calendar app's settings. + +### Can I filter the calendar before syncing externally? + +Yes. Apply filters to the Calendar view before generating the sync URL. Only events matching the filter conditions will appear in the external calendar subscription. This is useful for creating team-specific or project-specific calendar subscriptions. + +### How many events can the Calendar view display per day? + +There's no hard limit, but Calendar view displays up to 20 linked items by default in related features. For days with many events, consider using filters or creating more specific Calendar views. Very busy days may require scrolling to see all events. + +## Related resources + +### View basics +- [Views overview](/user-docs/overview-of-baserow-views) - Understanding all view types +- [Create custom views](/user-docs/create-custom-views-of-your-data) - Step-by-step view creation +- [View configuration options](/user-docs/view-customization) - General view settings + +### Calendar features +- [Date and time fields](/user-docs/date-and-time-fields) - Required for calendar views +- [Formula field overview](/user-docs/formula-field-overview) - Calculated dates +- [Row coloring](/user-docs/row-coloring) - Color-code events +- [Filters in Baserow](/user-docs/filters-in-baserow) - Show specific events +- [Public sharing](/user-docs/public-sharing) - Share calendars externally + +### Related field types +- [Created on field](/user-docs/date-and-time-fields#created-on) - Automatic creation dates +- [Last modified field](/user-docs/date-and-time-fields#last-modified-field) - Automatic modification timestamps +- [Collaborator field](/user-docs/collaborator-field) - Assign events to team members + +### Other view types +- [Grid view](/user-docs/guide-to-grid-view) - Spreadsheet interface +- [Timeline view](/user-docs/guide-to-timeline-view) - Date ranges and durations +- [Kanban view](/user-docs/guide-to-kanban-view) - Status-based tracking +- [Form view](/user-docs/guide-to-creating-forms-in-baserow) - Collect event registrations + +### External resources +- [Connect Google Calendar to Baserow](https://baserow.io/blog/connect-google-calendar-to-baserow-calendar-view) - Integration tutorial + +### Plans and features +- [Pricing plans](/user-docs/pricing-plans) - Feature availability by plan + +--- + + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow.io/user-docs/create-custom-views-of-your-data + [2]: https://baserow.io/user-docs/import-data-into-an-existing-table + [3]: https://baserow.io/user-docs/collaborative-views + [4]: https://baserow.io/user-docs/webhooks + [5]: https://baserow.io/user-docs/view-customization + [6]: https://baserow.io/user-docs/date-and-time-fields",,baserow_user_docs,https://baserow.io/user-docs/guide-to-calendar-view +138,Create a table via import,create-a-table-via-import,Import data to Baserow to create a table,"# Import data to create a table + +Baserow's import feature converts your existing data into organized tables; bring your spreadsheets to life with database capabilities. + +Create Baserow tables by importing CSV, Excel, JSON, or XML files, or paste data directly from spreadsheets. Convert existing data into structured tables with automatic field detection. + +> This guide covers creating new tables through import. To add data to existing tables, see [Import data into an existing table](/user-docs/import-data-into-an-existing-table). + + +## Overview + +Importing lets you create fully populated tables from existing data files or spreadsheets. Instead of manually entering data, upload your file and Baserow automatically creates a table with appropriate fields and rows. This is the fastest way to migrate data from spreadsheets, exports, or other platforms into Baserow. + +## Supported import formats + +| Format | Best for | File extension | +|--------|----------|----------------| +| **Paste data** | Quick transfers from spreadsheets | N/A | +| **CSV** | Simple tabular data from any spreadsheet app | .csv | +| **JSON** | Structured data exports from APIs or apps | .json | +| **XML** | Hierarchical data from technical systems | .xml | + +> All import methods are limited to 5,000 rows per table. For larger datasets, split your file and import in batches, or contact support for enterprise solutions. + + + +## Before you import: Preparation checklist + +**Clean your data:** +- Remove empty rows and columns that aren't needed +- Ensure consistent formatting (dates in one format, numbers without mixed text) +- Check that column headers are unique and descriptive +- Verify special characters display correctly + +**Format considerations:** +- First row should contain column headers (recommended but not required) +- Each column should contain similar types of data (all dates, all numbers, etc.) +- Text fields should not exceed reasonable lengths (very long text may cause issues) +- File size should be under 10MB for best performance + + +All imported data comes in as text fields initially. After import, you can [convert fields](/user-docs/field-customization) to their appropriate types (numbers, dates, select options, etc.). Alternatively, [import into an existing table](/user-docs/import-data-into-an-existing-table) to use pre-configured field types. + + +![JPEG Image Merge or upsert rows during additional import][1] + +## How to import data + +### Method 1: Paste data from spreadsheets + +Fastest option for copying data directly from Excel, Google Sheets, or other spreadsheet applications. This method works great for quick data transfers without saving intermediate files. + +**Step-by-step:** +1. Click on a [database](/user-docs/intro-to-databases) in the sidebar. Click **+ New table** at the bottom of the table list +2. Enter a descriptive name for your new table +3. Select **Paste table data** +4. Copy cells from your spreadsheet (Ctrl+C or Cmd+C) and paste into the text area +5. Check **First row is header** if your pasted data includes column names +6. Review the preview to ensure the data looks correct +7. Click **Add table** + + +### Method 2: Import CSV files + +CSV (Comma-Separated Values) is the universal export format supported by all spreadsheet applications. + +**Step-by-step:** +1. Click on a [database](/user-docs/intro-to-databases) in the sidebar. Click **+ New table** at the bottom of the table list +2. Enter a descriptive name for your new table +3. Select **Import CSV file** +4. Click **Choose CSV file** and select your file +5. Configure import settings: + - **Column separator:** Usually comma, but may be semicolon or tab + - **Encoding:** UTF-8 works for most files + - **First row is header:** Check if your CSV has column names in row 1 +6. Review the data preview to verify correct parsing +7. Click **Add table** + +**Troubleshooting CSV imports:** +- If data looks scrambled, try different column separators +- If special characters appear wrong, try a different encoding (UTF-8 vs. Latin-1) +- Ensure your CSV doesn't have nested commas within quoted fields + + +### Method 3: Import JSON files + +JSON files store structured data and are common exports from APIs, databases, and web applications. + +**Step-by-step:** + +1. Click on a [database](/user-docs/intro-to-databases) in the sidebar. Click **+ New table** at the bottom of the table list +2. Name your table +3. Select **Import a JSON file** +4. Click **Choose JSON file** and upload +5. Select encoding format (usually UTF-8) +6. Preview your data structure +7. Click **Add table** + + +**Supported JSON format:** +```json +[ + { + ""to"": ""Tove"", + ""from"": ""Jani"", + ""heading"": ""Reminder"", + ""body"": ""Don't forget me this weekend!"" + }, + { + ""to"": ""Bram"", + ""from"": ""Nigel"", + ""heading"": ""Reminder"", + ""body"": ""Don't forget the export feature"" + } +] +``` + +> **JSON requirements:** File must be an array of objects with consistent keys across all objects. Nested objects are flattened during import. + + + +### Method 4: Import XML files + +XML files contain hierarchical data often exported from technical systems or enterprise applications. + +**Step-by-step:** +1. Click on a [database](/user-docs/intro-to-databases) in the sidebar. Click **+ New table** at the bottom of the table list +2. Name your table +3. Select **Import an XML file** +4. Click **Choose XML file** and upload +5. Review the preview to ensure proper parsing +6. Click **Add table** + +> Complex nested structures are flattened. For best results, use XML files with simple, tabular structures. + + + +## After importing: Next steps + +### Convert field types + +All imported data starts as text fields. [Convert them][2] to appropriate types for better functionality: + +- Text that looks like numbers → [Number field](/user-docs/number-field) +- Text containing dates → [Date field](/user-docs/date-and-time-fields) +- Repeated values that should be choices → [Single select](/user-docs/single-select-field) or [Multiple select](/user-docs/multiple-select-field) +- URLs → [URL field](/user-docs/url-field) +- Email addresses → [Email field](/user-docs/email-field) + +### Create relationships + +If your imported data references other tables, set up relationships: +- Use [Link to table fields](/user-docs/link-to-table-field) to connect related records +- Add [Lookup fields](/user-docs/lookup-field) to display linked information +- Configure [Rollup fields](/user-docs/rollup-field) for calculations across relationships + +### Organize your view + +Customize how you work with imported data: +- [Filter and sort](/user-docs/filters-in-baserow) to focus on specific records +- [Create additional views](/user-docs/create-custom-views-of-your-data) (Kanban, Calendar, Gallery) +- [Color-code rows](/user-docs/row-coloring) for visual organization +- Set up [personal views](/user-docs/personal-views) for individual workflows + + +## Alternatives to importing + +**Start from scratch:** [Create blank tables](/user-docs/create-a-table) when building custom structures without existing data. + +**Use templates:** [Browse templates](/user-docs/add-database-from-template) for pre-built structures that match your use case. + +**Duplicate existing:** [Duplicate tables](/user-docs/create-a-table) to reuse proven structures with or without data. + +**Data sync:** [Set up data sync](/user-docs/data-sync-in-baserow) for automatic updates from external sources. + + + +## Troubleshooting common issues + +### Import job stuck or pending + +If import shows ""pending"" or ""running"" for extended periods, it could be because of system timeout or file processing issues. Jobs automatically fail and clear after 90-95 minutes. Wait for the timeout, then try again with a smaller file or a different format. + +### Data appears in the wrong columns + +If information doesn't align with headers correctly, it could be because of incorrect separator detection (CSV) or a malformed file structure. For CSV, manually select the correct column separator. For other formats, check that your source file is properly formatted before export. + +### Special characters display incorrectly + +If accented letters, symbols, or emojis show as gibberish, it could be because of an encoding mismatch between the source file and import settings. Try different encoding options (UTF-8 usually works best). If problems persist, save your source file with UTF-8 encoding before importing. + +### Import exceeds row limit + +If an error message about exceeding 5,000 rows, it could be because the file contains more than the maximum allowed rows. Split your file into multiple smaller files under 5,000 rows each. Import separately and merge if needed, or contact support for enterprise options. + +### Field types not recognized + +If dates, numbers, or other formatted data import as plain text, it could be because all imports default to text fields for safety. This is expected behavior. After import, manually convert fields to appropriate types using the field edit menu. For automatic type detection, [import into existing tables](/user-docs/import-data-into-an-existing-table) with pre-configured fields. + + + +## Frequently asked questions + +### What's the difference between creating a table via import vs. importing into an existing table? + +Creating via import generates a new table from your file with automatic structure detection. All fields start as text type. Importing into an existing table adds data to pre-configured fields with specific types, giving you better control over data validation and formatting. Use creation for new datasets, existing table imports for structured data entry. + +### Can I import multiple files at once? + +No, import one file at a time. Each import creates a separate table. If you need data from multiple files in one table, either combine them before importing or import separately and use [Link to table fields](/user-docs/link-to-table-field) to connect them. + +### Why are my dates and numbers showing as text? + +All imported data comes in as text fields to prevent data loss from incorrect type conversions. After import, convert fields to appropriate types ([Number](/user-docs/number-field), [Date](/user-docs/date-and-time-fields), etc.) using the field edit menu. This gives you control over formatting and validation. + +### How do I import more than 5,000 rows? + +Split large files into multiple smaller files under 5,000 rows each. Import them as separate tables, then consolidate if needed. For regular large imports, consider enterprise plans with higher limits or use the [Baserow API](/user-docs/database-api) for programmatic data insertion. + +### Can I preview my data before finalizing the import? + +Yes, all import methods show a preview before creating the table. This lets you verify column separation, encoding, and data structure. If the preview looks wrong, adjust settings (separator, encoding) or cancel and fix your source file. + + + + +## Related content + +Now that you've imported your data, explore these features: + +**Optimize your table:** +- **[Field types overview](/user-docs/baserow-field-overview)** – Learn about 25+ field types for conversion +- **[Field customization](/user-docs/field-customization)** – Configure properties and validation +- **[Table configuration](/user-docs/customize-a-table)** – Adjust appearance and behavior + +**Work with your data:** +- **[Filter and sort](/user-docs/filters-in-baserow)** – Focus on specific records +- **[Create views](/user-docs/create-custom-views-of-your-data)** – Visualize data in different ways +- **[Export tables](/user-docs/export-tables)** – Take data back out when needed + +**Expand functionality:** +- **[Link to table field](/user-docs/link-to-table-field)** – Create relationships between tables +- **[Formula fields](/user-docs/formula-field-overview)** – Add calculations and automation +- **[Import into existing tables](/user-docs/import-data-into-an-existing-table)** – Add more data later + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account. + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/b23ea9f0-9a3b-43c3-874f-86ad3641d3b1/Merge%20or%20upsert%20rows%20during%20additional%20import.jpg + [2]: https://baserow.io/user-docs/field-customization",,baserow_user_docs,https://baserow.io/user-docs/create-a-table-via-import +139,Remove workspace member,remove-a-user-from-a-workspace,Remove a user from a Baserow workspace,"# Remove a member from a workspace + +Workspace admins can instantly revoke access by removing members from a workspace. This action cannot be undone and permanently deletes all role and team assignments. + +This guide covers how workspace admins can remove members from a Baserow workspace, understand what happens when members are removed, and troubleshoot common access issues. + + +## Overview + +Removing a member is useful when project teams change, contracts end, or access needs to be restricted quickly. The removed member loses immediate access to all workspace databases and tables, but their Baserow account remains active for use in other workspaces. + +Only workspace admins can remove members. Regular workspace members cannot remove others from the member list. + + + +## Remove a member step-by-step + +You must have workspace admin permissions to remove members. + +1. Open the workspace containing the member you want to remove +2. Click the **Members** in the side bar +4. On the Members page, locate the person to remove +5. Click the **three-dot menu (⋮)** next to their name +6. Select **Remove from workspace** +7. Confirm the removal when prompted + +![Remove member interface in Baserow][1] + +> Use the search feature at the top of the Members page to quickly find members by name or email address. + + + +## What happens after removal + +When you remove a member from a workspace: + +- **Immediate access loss** – The member can no longer view or edit any workspace content +- **[Role assignments][2] deleted** – All permission levels are permanently removed +- **[Team assignments][3] deleted** – Membership in workspace teams is removed +- **Cannot be undone** – You must re-invite the member to restore access +- **Account remains active** – The user's Baserow account still exists for other workspaces + +The removed member does not receive an automatic notification. Consider informing them directly before removal if appropriate. + +## Removal vs. deletion comparison + +| Action | Scope | Account Status | Use Case | +|--------|-------|----------------|----------| +| **Remove member** | Single workspace | Account remains active | Revoke access to one workspace | +| **Delete user** (self-hosted) | Entire instance | Account permanently deleted | Remove user from self-hosted installation | + +Removing a member only affects access to one workspace. The user can still access other workspaces they belong to. Deleting a user account is only available to instance admins on self-hosted Baserow and removes the account completely. + + + +## Troubleshoot orphaned databases + +### Problem: No admins can access a database + +Databases can become orphaned when a workspace admin creates a database, restricts access for all other workspace members, and then leaves the workspace. No one can access the database because no remaining workspace members have admin permissions. + +### Solution + +1. **Invite a new user** to the workspace (someone who hasn't been excluded from the database) +2. **Assign admin role** to the new user at the workspace level +3. **Grant database access** by having the new admin adjust database-level permissions +4. **Restore access** for other workspace members as needed + +This process requires workspace admin permissions to invite and assign roles. + + +## Frequently asked questions + +### Can I undo removing a member? + +No. Removing a workspace member permanently deletes their role and team assignments within that workspace. To restore access, you must re-invite them and reconfigure all permissions and team memberships. + +### Does the removed member get notified? + +Baserow does not send automatic notifications when workspace members are removed. Consider communicating with the member before or after removal if appropriate for your situation. + +### What happens to data created by removed members? + +All data, rows, tables, and views created by the removed workspace member remain in the workspace. Only their access is revoked; their contributions are preserved. + +### Can I remove myself from a workspace? + +Yes, but only if you're not the last admin. Workspaces must always have at least one admin. If you're the sole admin, you must either promote another workspace member to admin first or delete the workspace entirely. + +### What's the difference between workspace members and collaborators? + +Workspace members are users who have access to a workspace with assigned roles (Admin, Editor, etc.). Collaborators refer to the Collaborator field type used to assign specific workspace members to individual rows for task assignment. + + + +## Related content + +- [Add workspace collaborators](/user-docs/working-with-collaborators) +- [Manage workspace members](/user-docs/manage-workspace-permissions) +- [Understand role hierarchy](/user-docs/role-based-access-control-rbac) +- [Create and manage teams](/user-docs/create-and-manage-teams) (Enterprise) +- [Assign roles at workspace level](/user-docs/assign-roles-to-members-at-workspace-level) + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/a766fd4b-6c7b-49ee-a908-84d859992dc3/Remove%20a%20member%20from%20a%20workspace.jpg + [2]: https://baserow.io/user-docs/permissions-overview + [3]: https://baserow.io/user-docs/create-and-manage-teams",,baserow_user_docs,https://baserow.io/user-docs/remove-a-user-from-a-workspace +140,Count field,count-field,Count field in Baserow,"# Working with the Count field + +The **Count field** automatically counts the number of linked records from another table, giving you a simple, real-time summary of related data. + +This guide covers what a Count field is, the prerequisites for adding a Count field, how to create and configure a Count field, how to sort and filter by the count, and the difference between a Count field and a Rollup field. + +Learn more: [Configure field types](https://baserow.io/user-docs/field-customization) + +![Configuring a new Count field in Baserow][3] + +## What is a Count field? + +A Count field works *after* you have set up a [Link-to-table field][1]. It looks at that link and displays a number representing *how many* records are linked to that specific row. + +This field is **read-only**, meaning you cannot type in the number yourself. It's an automatic calculation that updates every time you add or remove a record in the [Link-to-table field][1]. + + +## How to create a Count field + +### Prerequisite +You must have an existing [Link-to-table field][1] in your table before you can create a Count field. + +### Steps +1. In your table, click the plus sign `+` to [add a new field](/user-docs/adding-a-field). +2. Give the field a name (e.g., ""Total Orders"" or ""Task Count""). +3. Select **Count** from the field type dropdown menu. +4. From the **Select a link row field** dropdown, choose the [Link-to-table field][1] you want to count. If you have multiple links, select the one that corresponds to the records you want to total. +5. Click **Create**. + +The new read-only field will now be populated with the total count of linked records for each row. + +## Example: Customers and Orders + +Imagine you have two tables, you want to see the *total number of orders* each customer has placed, directly in your **Customers** table. + +1. **Customers** table: Contains `Customer Name` and `Email`. +2. **Orders** table: Contains `Order ID` and a [Link-to-table field][1] called `[Link] Customer`. + +**Solution:** +In your **Customers** table, you would: +1. Create a **Count field** named ""Total Orders."" +2. Configure this new field to ""watch"" the `[Link] Customer` field (which shows up in your **Customers** table as a link to **Orders**). + +The ""Total Orders"" field will now automatically display a number (e.g., ""3"") for each customer, showing exactly how many orders they are linked to. + +### Sorting and filtering +You can easily use a Count field to sort or filter your table. For example, you could: +* **Sort** your ""Customers"" table by the ""Total Orders"" field in descending order to see your most active customers first. +* **Filter** your ""Tasks"" table to only show records where the ""Sub-task Count"" is greater than 0. + + + +## Frequently asked questions + +### What's the difference between a Count field and a Rollup field? +They are very similar, but have one key difference: +* **Count field:** This *only* counts the number of linked records. +* **[Rollup field][51]:** This can perform other calculations. It can sum, average, find the min/max, or count based on a *specific field* within the linked records (e.g., ""Sum of Order Amount"" or ""Average Rating""). + +If you *only* need to know ""how many,"" the **Count field** is the simplest and fastest option. + +### Why can't I edit the number in a Count field? +The Count field is **read-only** because it's an automatic calculation, not a data entry field. The number in this field is a *result* of how many records are linked. To change the number, you must add or remove links in the associated [Link-to-table field][1]. + +### Does the Count field update automatically? +Yes. As soon as you add or remove a link in the [Link-to-table field][1], the Count field will update in real-time to show the new total. + + + +## Related content +* [Link-to-table field][1] +* [Rollup field][51] +* [Lookup field][48] +* [Introduction to fields in Baserow][25] + +--- + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account. + + [1]: /user-docs/link-to-table-field + [2]: /user-docs/adding-a-field + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/1cddd056-3354-44d6-9a5b-95e6115d41ae/Count%20field%20Baserow.webp + [25]: /user-docs/baserow-field-overview + [48]: /user-docs/lookup-field + [51]: /user-docs/rollup-field",,baserow_user_docs,https://baserow.io/user-docs/count-field +141,Rollup field,rollup-field,Rollup field in Baserow,"# Working with the Rollup field + +The **Rollup field** performs calculations (like `sum`, `average`, or `count`) on a set of linked records, summarizing data from another table. + +This guide covers what a Rollup field is and a clear example of its use, how a rollup differs from a Lookup or Count field, and how to create and configure a Rollup field. + +Learn more: [Configure field types](https://baserow.io/user-docs/field-customization) + +## What is a Rollup field? + +A Rollup field works *after* you have already set up a [Link-to-table field][1]. While a [Lookup field][48] pulls *one* piece of data (like an email), a Rollup field performs a *calculation* on *all* the linked records. + +This field is **read-only**, meaning you cannot edit the value directly. It's an automatic calculation that updates whenever the data in the linked records changes. + + + + + +## How to create a Rollup field + +### Prerequisite +You must have an existing [Link-to-table field][1] in your table before you can create a Rollup field. + +### Steps +1. In your table, click the plus sign `+` to [add a new field](/user-docs/adding-a-field). +2. Input a name for your field (e.g., ""Total Spent"" or ""Average Rating""). +3. Select **Rollup** from the field type dropdown menu. +4. In the configuration panel, you must select three things: + * **Select a link row field:** Choose the [Link-to-table field][1] you want to use. + * **Select a field to rollup:** Choose the specific field *from the linked table* that you want to calculate (e.g., `Order Amount`). + * **Select a rollup function:** Choose the calculation you want to perform (e.g., `sum`). +5. Click **Create**. + +The new read-only field will now be populated with the result of your calculation. + +![Configuring a new Rollup field in Baserow][4] + + + +## Rollup functions + +Rollup fields can perform a variety of calculations. The function you choose must be compatible with the field type you are rolling up (e.g., you can only `sum` a [number field][7]). + +| Function | Description | Usable Field Type(s) | +| --- | --- | --- | +| `sum` | Adds all values together. | [Number][7] | +| `avg` | Calculates the average of all values. | [Number][7] | +| `count` | Returns the total number of linked items. | *Any* | +| `max` | Returns the highest value. | [Number][7], [Date][8], [Text][6] | +| `min` | Returns the lowest value. | [Number][7], [Date][8], [Text][6] | +| `any` | Returns `true` if *any* linked boolean is `true`. | [Boolean][5] | +| `every` | Returns `true` if *all* linked booleans are `true`. | [Boolean][5] | +| `stddev_sample` | Sample standard deviation. | [Number][7] | +| `stddev_pop` | Population standard deviation. | [Number][7] | +| `variance_sample` | Sample variance. | [Number][7] | +| `variance_pop` | Population variance. | [Number][7] | + +### Example: Customers and Orders + +This is the best way to summarize related data. Imagine you have two tables, you want to see the **total amount of money** each customer has spent, directly in your **Customers** table. + +1. **Customers**: Contains `Customer Name`. +2. **Orders**: Contains `Order ID`, an `Order Amount` (a [number field][7]), and a [Link-to-table field][1] called `[Link] Customer`. + +**Solution:** +In your **Customers** table, you would create a **Rollup field** named ""Total Spent"": +* **Link-to-table field:** Choose the `[Link] Customer` field. +* **Field to rollup:** Choose the `Order Amount` field from the **Orders** table. +* **Rollup function:** Select `sum`. + +The ""Total Spent"" field will now automatically calculate and display the sum of all linked orders for each customer (e.g., ""$150.00""). + +## Frequently asked questions + + +### What's the difference between a Rollup, Lookup, and Count field? +They all use the [Link-to-table field][1], but for different jobs: +* **[Link-to-table][1]:** Creates the *relationship* (links 'Order' to 'Customer'). +* **[Lookup][48]:** *Displays* data from a linked record (shows the 'Customer's Email'). +* **[Count][50]:** *Counts* the *number of linked records* (shows '3 Orders'). +* **Rollup:** *Performs a calculation* on the linked records (shows the *sum* of 'Order Amount'). + +### What's the difference between the rollup `count` function and a Count field? +They produce the exact same result. The [Count field][50] is just a dedicated, simpler field for this one purpose. The Rollup field's `count` function is one of many options available. + +### Why can't I edit a Rollup field? +It's a **read-only** field that displays the result of a calculation. To change the value, you must change the data in the underlying linked records (e.g., add a new order, or change an order's amount). + + + +## Related content +* [Link-to-table field][1] +* [Lookup field][48] +* [Count field][50] +* [Introduction to fields in Baserow][25] + +--- + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account. + + [1]: /user-docs/link-to-table-field + [2]: /user-docs/adding-a-field + [3]: /user-docs/field-customization#edit-field + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/64315572-6f87-4c0c-a72b-05d8fc8925ed/Rollup%20field.webp + [5]: /user-docs/boolean-field + [6]: /user-docs/single-line-text-field + [7]: /user-docs/number-field + [8]: /user-docs/date-and-time-fields + [25]: /user-docs/baserow-field-overview + [48]: /user-docs/lookup-field + [50]: /user-docs/count-field",,baserow_user_docs,https://baserow.io/user-docs/rollup-field +142,Permission roles,set-permission-level,Baserow: understand role levels,"# Baserow role levels and permissions + +Roles determine specific capabilities: who can invite members, create databases, edit data, or simply view content. You assign these roles at three levels (workspace, database, table), with more specific assignments overriding broader ones. + +This guide covers the actions each role can perform at the workspace, database, and table levels. + +> **Paid feature:** Role-based permissions are available on Baserow Advanced and Enterprise plans. [View pricing details](https://baserow.io/pricing). + +## Overview + +Baserow offers permission roles that control what members can do with workspaces, databases, and tables; from full administrative control to read-only access. + +When you [invite members to a workspace](/user-docs/manage-workspace-permissions), you select their initial role. Workspace admins can modify these roles at any time to adjust permissions as the team's needs evolve. + +> The workspace creator automatically becomes a workspace Admin. Workspaces can have multiple Admins. + +For how roles interact when assigned at multiple levels, see [Understanding role hierarchy](/user-docs/role-based-access-control-rbac). + +## The roles explained + +| Role | Summary | Typical Users | +|------|---------|---------------| +| **Admin** | Full control: manage members, settings, and all content | Workspace owners, department heads | +| **Builder** | Create databases and applications; cannot manage members | Application developers, power users | +| **Editor** | Create and edit data; cannot modify structure | Data managers, content editors | +| **Commenter** | Add comments; cannot edit data | Reviewers, stakeholders | +| **Viewer** | Read-only access | External observers, reporting users | +| **No Role** | No access; requires explicit grants | (Special case for security) | + +Admins at any level can remove access from each other. For example, a Database Admin can create a private database by setting ""No Access"" for workspace Admins. Table Admin can restrict a table from database Admins. This enables granular control over sensitive data. + +Learn about [assigning these roles](/user-docs/assign-roles-to-members-at-workspace-level). + + +## Workspace-level role capabilities + +When a member has a role at the workspace level, these permissions apply to everything in the workspace unless overridden at the database or table level. + +| | Admin | Builder | Editor | Commenter | Viewer | +| --- | --- | --- | --- | --- | --- | +| **Member management** | | | | | | +| Invite members to workspace | ✓ | | | | | +| Manage member roles | ✓ | | | | | +| Remove member access | ✓ | | | | | +| **Content management** | | | | | | +| View workspace trash | ✓ | ✓ | | | | +| Access all databases and tables | ✓ | ✓ | ✓ | ✓ | ✓ | + +> Only workspace Admins can manage workspace membership. Database or table Admins cannot invite members to the workspace; only manage access at their assigned level. + +Learn how to [assign workspace-level roles](/user-docs/assign-roles-to-members-at-workspace-level). + +## Database-level role capabilities + +Database-level roles apply to all tables within that specific database unless overridden at the table level. + +| | Admin | Builder | Editor | Commenter | Viewer | +| --- | --- | --- | --- | --- | --- | +| **Access management** | | | | | | +| Grant database access to members | ✓ | | | | | +| Manage member roles on database | ✓ | | | | | +| Remove database access | ✓ | | | | | +| **Database operations** | | | | | | +| View database trash | ✓ | ✓ | | | | +| Access all tables in database | ✓ | ✓ | ✓ | ✓ | ✓ | + +> Database Admins can make a database private by removing access for other members (even workspace Admins), unless those members have explicit table-level access. + +Learn how to [assign database-level roles](/user-docs/assign-roles-at-database-level). + + +## Table-level role capabilities + +Table-level roles apply to a specific table only; the most granular permission level. + +| | Admin | Builder | Editor | Commenter | Viewer | +| --- | --- | --- | --- | --- | --- | +| **Access management** | | | | | | +| Manage member roles on table | ✓ | | | | | +| Remove table access | ✓ | | | | | +| **Table structure** | | | | | | +| Create, rename, delete fields | ✓ | ✓ | | | | +| Reorder fields | ✓ | ✓ | | | | +| Update field metadata | ✓ | ✓ | | | | +| **Views and sharing** | | | | | | +| Create, edit, delete views | ✓ | ✓ | | | | +| Create webhooks | ✓ | ✓ | | | | +| Generate public share links | ✓ | ✓ | | | | +| **Data operations** | | | | | | +| Create, update, delete rows | ✓ | ✓ | ✓ | | | +| Update cell values | ✓ | ✓ | ✓ | | | +| Add comments to rows | ✓ | ✓ | ✓ | ✓ | | +| View table data | ✓ | ✓ | ✓ | ✓ | ✓ | + +> Table Admins can restrict access from higher-level Admins by setting ""No Access"" role at the table level; useful for sensitive data like salary tables. + +Learn how to [assign table-level roles](/user-docs/assign-roles-at-table-level). + + +## Role comparison at a glance + +### Permission hierarchy by role + +**Admin** (Full control) +- ✓ Everything Builder can do, plus: +- ✓ Manage members and roles +- ✓ Remove access from other users + +**Builder** (Structure & applications) +- ✓ Everything Editor can do, plus: +- ✓ Create/modify fields, views, webhooks +- ✓ Build applications + +**Editor** (Data management) +- ✓ Everything Commenter can do, plus: +- ✓ Create, update, delete rows +- ✓ Edit cell values + +**Commenter** (Feedback only) +- ✓ Everything Viewer can do, plus: +- ✓ Add comments to rows + +**Viewer** (Read-only) +- ✓ View all data in assigned areas +- ✓ No modification abilities + +**No Role** + +""No Role"" means zero default access. Members with ""No Role"" can only access content through: +- Team membership with assigned roles +- Explicit database-level grants +- Explicit table-level grants + +This is useful for zero-trust security models. Learn more about [using ""No Role"" strategically](/user-docs/assign-roles-to-members-at-workspace-level#advanced-role-configuration-strategies). + +## Frequently asked questions + +### Can a Viewer ever edit data? + +No. Viewers have read-only access at their assigned level. To enable editing, change their role to Editor or higher. + +### What's the difference between Builder and Editor? + +Builders can modify table structure (fields, views) and create applications. Editors can only modify data (rows, cells) but not the structure. + +### Can a database Admin manage workspace members? + +No. Only workspace Admins can invite, manage, or remove workspace members. Database Admins can only manage access at the database level. + +### If I'm a workspace Admin, can I access all tables? + +Not necessarily. A database or table Admin can restrict your access by explicitly setting the ""No Access"" role for you at that level. Table-level roles override workspace roles. + +### How do I give someone permission to create databases? + +Assign them the Builder or Admin role at the workspace level. Editors and below cannot create databases. + +### Can Commenters see all data? + +Yes. Commenters have the same viewing permissions as Viewers; they just have the additional ability to add comments. They cannot edit data. + + + +## Related content + +**Assign roles:** +- [Assign roles to members at workspace level](/user-docs/assign-roles-to-members-at-workspace-level) +- [Assign roles to teams at workspace level](/user-docs/assign-roles-to-teams-at-workspace-level) +- [Assign roles at database level](/user-docs/assign-roles-at-database-level) +- [Assign roles at table level](/user-docs/assign-roles-at-table-level) + +**Understand the system:** +- [Understanding role hierarchy](/user-docs/role-based-access-control-rbac) +- [Permissions overview](/user-docs/permissions-overview) + +**Manage members:** +- [Invite workspace members](/user-docs/manage-workspace-permissions) +- [Create and manage teams](/user-docs/create-and-manage-teams) + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account",,baserow_user_docs,https://baserow.io/user-docs/set-permission-level +143,Comments and mentions,row-commenting,Row comments and mentions in Baserow,"# Row comments and mentions + +Row comments transform your Baserow tables into collaborative workspaces, letting teams discuss data, ask questions, and provide context without leaving the database or switching to external messaging tools. + +This guide explains how to use row comments to collaborate with team members, mention users for notifications, and track discussions on specific records in your Baserow tables. + +> **Paid feature:** Row comments and mentions are available on [paid plans][1]. Upgrade to enable team collaboration directly within your table rows. + + + +## Overview + +Row comments create conversation threads attached to individual records in your tables. Each row can have its own discussion where team members ask questions, provide updates, share context, or collaborate on data decisions; all visible to everyone with access to the table. + +Comments appear in a dedicated panel within the row detail view, keeping conversations organized and connected to the relevant data. You can mention specific collaborators to notify them, edit comments after posting, and follow rows to receive notifications about all activity on important records. + +## Comment and mention features + +| Feature | Capability | Notification | +|---------|-----------|--------------| +| **Row comments** | Add discussion threads to any row | Optional (follow row for all comments) | +| **User mentions** | Tag specific users with @ symbol | Automatic notification to mentioned user | +| **Comment editing** | Modify comments after posting | No notification sent | +| **Comment deletion** | Remove your own comments | No notification sent | +| **Row following** | Subscribe to all activity on a row | Notification for every new comment | +| **Comment indicators** | See comment count on rows | Visual badge shows number of comments | + +## When to use row comments + +**Project collaboration:** Discuss task progress, blockers, or requirements directly on project rows without external messaging tools. + +**Data review workflows:** Ask questions about data accuracy, request clarification, or provide approval comments during review processes. + +**Customer support:** Document customer interactions, internal notes, or resolution details on customer record rows. + +**Approval processes:** Track approval status, stakeholder feedback, and decision rationale on rows requiring sign-off. + +**Knowledge sharing:** Provide context about how data was collected, why decisions were made, or what follow-up actions are needed. + +## How to view row comments + +Baserow displays a comment count indicator on rows that have comments, making it easy to spot active discussions at a glance. + +![Comment count indicator on rows](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/Screenshot_2022-06-15_at_12.53.32.png) + +**To view comments on a row:** + +1. Click the expand icon to open the [row detail panel][2] +2. The comments panel appears on the right side by default +3. Scroll through the comment feed to read the discussion + +If the comments panel is hidden, click the expand button (`<<`) in the top-right corner to show it. + + + +**To hide the comments panel:** Click the collapse button (`>>`) in the top-right corner when you need more screen space for editing fields. + +![Row comments panel in Baserow](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/d3c0054b-5310-4071-b160-8ba1b5210ec6/Comment_panel.png) + +## How to add row comments + +Post comments directly from the row detail panel to start or join discussions. + +**To add a comment:** + +1. Open the [row detail panel][2] for the record you want to comment on +2. Locate the comment box at the bottom of the comments panel on the right +3. Type your message in the comment box +4. Press **Enter** or click the send button to post + +Your comment appears immediately in the feed, and any mentioned users receive notifications. + + +## How to edit row comments + +Fix typos, clarify your message, or update information in comments you've already posted. + +**To edit a comment:** + +1. Locate your comment in the comment feed +2. Click the **menu button** (three dots) on the right side of your comment +3. Select **Edit comment** from the dropdown menu +4. Make your changes in the comment box +5. Press **Enter** to save the updated comment + +> Only the comment author can edit their own comments. Edited comments don't trigger new notifications. + +![Editing row comments in Baserow](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/2821f369-679d-4a8f-8feb-eb73fc90dfa9/baserow%20comments.png) + +## How to delete row comments + +Remove comments that are no longer relevant or were posted by mistake. + +**To delete a comment:** + +1. Find the comment you want to remove in the feed +2. Click the **menu button** (three dots) on the right side of the comment +3. Select **Delete comment** from the dropdown menu +4. Confirm the deletion if prompted + +You can [restore deleted comments from the trash][3]. Only comment authors can delete their own comments. + +![Deleting row comments](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/b56a118e-53ff-4b4b-aa22-49aa8d579fbd/Comments.png) + +## How to follow rows for comment notifications + +Following a row subscribes you to notifications for all comment activity on that record, even if no one mentions you directly. + +**To follow or unfollow a row:** + +1. Open the [row detail panel][2] +2. Click the **bell icon** at the top of the comments panel +3. When the following is active, the bell icon appears filled +4. Click again to unfollow and stop receiving notifications + +Following rows help you stay updated on important records without needing to check them manually. Learn more about [managing notifications][4]. + +![Following rows for comment notifications](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/133f6a9a-fb43-4782-87bb-14bee8bd7d20/Watching%20comments.png) + +## How to mention users in comments + +Mentions notify specific [collaborators][5] about comments that require their attention, ensuring they see important messages even if they're not following the row. + +**To mention a user:** + +1. Type the **@ symbol** in the comment box +2. A dropdown appears showing available collaborators +3. Select the user's name from the list (or continue typing to filter) +4. Finish your comment and press **Enter** to post + +The mentioned user receives a [notification][4] immediately, directing them to the row and comment. + +![Mentioning users in Baserow comments](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/e8a3b900-0bac-43d0-95da-fae082666315/Mentions.png) + +> You can mention multiple users in a single comment by typing @ multiple times. Each mentioned user receives their own notification. + +## Frequently asked questions + +### Can I comment on rows in free Baserow accounts? + +No, row comments and mentions are paid features. Users on [free plans][1] can view existing comments if a paid user adds them to a paid workspace, but cannot create, edit, or delete comments themselves. + +### Do collaborators get notified of every comment on a row? + +Only if they've followed the row or were mentioned directly. By default, users only receive notifications when someone mentions them with the `@` symbol. Click the bell icon to follow a row for all comment notifications. + +### Can I see who viewed my comments? + +No, Baserow doesn't track comment views or read receipts. You'll know someone saw your comment if they reply, react, or take action based on your message. + +### What happens to comments if I delete a row? + +Comments are deleted permanently along with the row. If you [restore the row from trash][3] before the grace period expires, the comments are restored too. + +### Can I attach files or images to comments? + +Not directly in comments. However, you can reference files uploaded to [file fields][6] in the same row, or use external links to share images or documents in your comments. + +### Do comments export when I export my table? + +No, comments are collaboration metadata and don't export with table data in CSV or Excel formats. Comments exist only within the Baserow interface and are tied to the row's internal database record. + +## Related content + +- [Rows overview][7] - Learn fundamental row concepts +- [Row detail panel][8] - Open expanded view for commenting +- [Notifications in Baserow][4] - Manage your notification settings +- [Working with collaborators][5] - Add team members to your workspace +- [Row change history][9] - Track data changes over time +- [Premium features][1] - Explore other Premium capabilities + +--- + + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: /user-docs/pricing-plans + [2]: https://baserow.io/user-docs/enlarging-rows + [3]: https://baserow.io/user-docs/data-recovery-and-deletion + [4]: /user-docs/notifications + [5]: /user-docs/working-with-collaborators + [6]: /user-docs/file-field + [7]: /user-docs/overview-of-rows + [8]: /user-docs/enlarging-rows + [9]: /user-docs/row-change-history",,baserow_user_docs,https://baserow.io/user-docs/row-commenting +144,Create and manage teams,create-and-manage-teams,Create and manage teams in Baserow,"# Create and manage teams in a workspace + +Teams in Baserow enable workspace admins to manage permissions for multiple members simultaneously, creating organized groups with shared access levels across databases and tables. + +This guide covers how to create teams in Baserow workspaces, assign default roles to groups of members, and manage team permissions for efficient collaboration at scale. + +> **Paid feature:** Role-based permissions are available on the [Baserow Advanced and Enterprise plans][1]. + + +## Overview + +Rather than [setting permissions][2] individually for each workspace member, teams allow you to assign a default role to a group. All team members automatically inherit that role throughout the workspace, with options to customize permissions at the database or table level when needed. + +Teams are valuable for large organizations with departments, project groups, or client teams that need consistent access levels. For example, create a ""Marketing Team"" with Editor access, a ""Client Review Team"" with Commenter access, or an ""Executive Team"" with Admin access. + +Teams can also form [hierarchies][3]; higher-level teams can access everything owned by lower-level teams, but not vice versa. This creates natural organizational structures like Department → Project Group → Individual Contributors. + +Learn more: [Manage permissions in Baserow][2] + +![Create team in baserow][4] + +## How teams work + +### Teams vs. individual permissions + +| Approach | Best For | Permission Management | Updates | +|----------|----------|----------------------|---------| +| **Teams** | Groups of 3+ members with shared roles | Set once at team level | Change team role to update all members | +| **[Individual permissions][5]** | Unique access needs, small workspaces | Set per member | Update each member individually | + +### Team permission inheritance + +When you create a team: + +1. **Default role applies workspace-wide** – All team members get the assigned role for the entire workspace +2. **Exceptions can be set** – Override the default role for specific databases or tables +3. **[Individual permissions][5] take precedence** – Member-specific roles override team defaults +4. **Team hierarchy matters** – Higher teams can access lower team content (but not vice versa) + +Learn more: How teams work, team permission inheritance and how to [assign roles to teams at workspace level][6] + +## Create a team step-by-step + +### Prerequisites + +- Workspace admin permissions +- At least one workspace member to add to the team (learn how to [invite workspace members](/user-docs/working-with-collaborators)) + +### Steps to create a team + +1. Navigate to your workspace +2. Select **Members** in the sidebar to open the Members page +3. Click the **Teams** tab at the top of the page +4. Click **Create team** +5. In the team creation dialog, **input team name**, **select default role** from the dropdown, and **add workspace members** to the team by clicking **Add members** button +6. Search for members to add: + - Use the search box to find specific members + - Check individual boxes or click **Select all** + - The modal shows the total members selected + - Click **Invite** to add them to the team + + ![Add members to team](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/fac5e85e-ddf1-438d-a422-5e212379aa0c/Screenshot_2023-01-18_at_17.29.34.png) + +7. Click **Save** to create the team + +All selected members now have the team's default role throughout the workspace. You can customize their access at the [database][7] or [table level][8] if needed. + + +## Manage existing teams + +### Edit team settings + +To modify a team's name, default role, or members: + +1. Open the **Members** page and click the **Teams** tab +2. Click the **three-dot menu (•••)** next to the team name +3. Select **Edit team** +4. Make your changes: Update team name, Change the default role from the dropdown, or Add or remove members +5. Click **Save** + +Changing the default role immediately updates permissions for all team members across the workspace. + +### Add members to an existing team + +1. Click the **three-dot menu (•••)** next to the team name +2. Select **Edit team** +3. Click **Add members** +4. Search and select members using checkboxes +5. Click **Invite**, then **Save** + +New members immediately inherit the team's default role. + +### Remove members from teams + +When you remove a member from a team, they immediately lose all team-based permissions but retain any individual permissions assigned directly to them. + + 1. Navigate to **Members** → **Teams** tab + 2. Click the **three-dot menu (•••)** next to the team name + 3. Select **Edit team** + 4. Click the **delete icon** next to the member you want to remove + 5. Click **Save** + +Removed members lose team-based permissions but retain any individual permissions assigned directly to them. + +> **Note:** Removing a member from a team cannot be undone. To restore access, you must re-add them to the team. + +### Delete a team + +1. Click the **three-dot menu (•••)** next to the team name +2. Select **Delete team** +3. Confirm the deletion + +![Delete team option](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/bf46fc5a-6922-4c44-9834-fc07d402924d/Screenshot_2023-01-18_at_10.08.44.png) + +Deleting a team removes the team structure but does not delete members from the workspace. Members retain any individual permissions assigned to them. + + +## Frequently asked questions + +### Can a workspace member belong to multiple teams? + +Yes. Members can belong to multiple teams simultaneously. When this happens, they receive the highest permission level from any team they're part of. Individual permissions still take precedence over all team permissions. + +### What happens when I change a team's default role? + +All team members immediately inherit the new role across the workspace, unless they have individual permission overrides at the database or table level. Changes apply in real-time. + +### Do I need to add members to the workspace before adding them to a team? + +Yes. Members must first be invited to the workspace before they can be added to any team. Teams organize existing workspace members; they don't handle initial workspace invitations. + +### What's the difference between teams and assigning roles individually? + +Teams allow bulk permission management for groups. Instead of setting permissions for each member individually, you set them once at the team level. This is more efficient for organizations with consistent role structures. + +### Can I see which teams a member belongs to? + +Yes. On the Members page, you can view each member's team memberships. Click on a member to see their individual permissions and team assignments. + +### What happens to team members when I delete a team? + +Team members remain in the workspace with any individual permissions they had. Only the team structure and team-based permissions are removed. Members are not deleted from the workspace. + + + +## Related content + +- [Assign roles to teams at workspace level](/user-docs/assign-roles-to-teams-at-workspace-level) +- [Understand role hierarchy](/user-docs/role-based-access-control-rbac) +- [Manage workspace members](/user-docs/manage-workspace-permissions) +- [Add workspace collaborators](/user-docs/working-with-collaborators) +- [Assign roles at database level](/user-docs/assign-roles-at-database-level) +- [Permissions overview](/user-docs/permissions-overview) + +--- + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](https://baserow.io/contact) for questions about Baserow or help with your account + + + [1]: https://baserow.io/pricing + [2]: https://baserow.io/user-docs/permissions-overview + [3]: https://baserow.io/user-docs/role-based-access-control-rbac + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/deffe568-7dec-40be-b168-46d3fd75b79e/Create%20team.jpg + [5]: https://baserow.io/user-docs/assign-roles-to-members-at-workspace-level + [6]: https://baserow.io/user-docs/assign-roles-to-teams-at-workspace-level + [7]: https://baserow.io/user-docs/assign-roles-at-database-level + [8]: https://baserow.io/user-docs/assign-roles-at-table-level",,baserow_user_docs,https://baserow.io/user-docs/create-and-manage-teams +145,Introduction to Baserow,baserow-basics,Getting started with Baserow,"# Getting started with Baserow + +Baserow is an open-source no-code database platform that lets you build custom databases, applications, and automations without coding. Whether you're managing data, building workflows, or creating business apps, Baserow gives you developer-level power through an intuitive browser interface. + +## What is Baserow? + +Baserow makes it easy to build custom databases and applications in minutes, not months. + +Baserow is an open-source no-code platform that empowers teams to create databases, build applications, and automate workflows without writing code. It combines the familiarity of spreadsheets with the power of relational databases, making it accessible to everyone while remaining flexible enough for complex business needs. + + + + +### Why teams choose Baserow + +- **No coding required**: Build databases and applications using drag-and-drop interfaces +- **Real-time collaboration**: Work together with your team on shared databases and projects +- **API-first design**: Connect Baserow to 4,000+ tools through webhooks and integrations +- **Flexible deployment**: Choose between Baserow Cloud (hosted) or Self-Hosted (your infrastructure) +- **Open source**: Full transparency and community-driven development + +## Core Baserow modules + +Baserow consists of five integrated modules that work together to transform how you manage data and build workflows: + +| Module | What it does | Best for | +|--------|-------------|----------| +| **[Database builder][1]** | Create custom tables, define relationships, and visualize data with multiple views | Organizing structured data, managing projects, tracking inventory | +| **[Application builder][2]** | Build custom web applications without code using drag-and-drop elements | Creating portals, internal tools, customer-facing apps | +| **[Dashboard builder][3]** | Visualize data with charts and metrics in customizable dashboards | Monitoring KPIs, tracking performance, executive reporting | +| **[Automation builder][4]** | Automate workflows and connect to external services | Streamlining repetitive tasks, triggering actions, syncing data | +| **[Baserow AI][5]** | Generate formulas, transform data, and automate content creation | Writing formulas, data enrichment, content generation | + +## Deployment options + +### Baserow Cloud + +Fully managed hosting where Baserow handles infrastructure, updates, backups, and security. Perfect for teams who want to get started immediately without technical setup. + +### Baserow Self-Hosted + +Deploy Baserow on your own servers (on-premise or cloud) for complete control over your data and infrastructure. Ideal for organizations with specific security or compliance requirements. + +Learn more about deploying Baserow and [choose your hosting option][6]. + +## Enterprise features + +For organizations requiring advanced security and governance, [Baserow Enterprise][7] provides: + +- Advanced role-based permissions and team management +- Audit logs for compliance and security tracking +- Single Sign-On (SSO) integration +- Priority support and SLAs +- Scalable infrastructure for large teams + +## Integrations and API + +Baserow features an [API-first design][8] that enables seamless integration with your existing tools: + +- **Native integrations**: Zapier, Make, n8n, Pipedream, and more +- **REST API**: Comprehensive API documentation for custom integrations +- **Webhooks**: Real-time notifications for data changes +- **Database tokens**: Secure API access for external applications + +Learn more about [Baserow integrations][9] and how to connect with other platforms. + +## Who uses Baserow? + +### By department +- **HR**: Employee records, recruitment tracking, onboarding workflows +- **Marketing**: Campaign management, lead tracking, content calendars +- **Sales**: CRM, pipeline management, sales performance tracking +- **IT**: Asset management, ticketing systems, software licenses +- **Operations**: Process management, project tracking, operational metrics +- **Finance**: Budget tracking, expense management, financial reporting + +### By industry +- **Manufacturing**: Production schedules, inventory, supply chain management +- **Healthcare**: Patient data, medical records, facility operations +- **Education**: Student information, curriculum management, academic tracking +- **Financial Services**: Client data, transactions, portfolio management +- **Real Estate**: Property tracking, construction projects, budget oversight +- **Technology**: Development projects, release management, user feedback + +![Introduction to Baserow platform][10] + +## Frequently asked questions + +### What makes Baserow different from other no-code platforms? + +Baserow is fully open source and offers both cloud and self-hosted deployment options. It combines spreadsheet simplicity with database power, features an API-first design for unlimited integrations, and doesn't lock you into proprietary formats or vendor-specific ecosystems. + +### Do I need coding skills to use Baserow? + +No. Baserow is designed for users without programming knowledge. The drag-and-drop interface, visual builders, and formula generator make it accessible to everyone. However, developers can leverage the API for advanced customizations if needed. + +### Can Baserow handle large datasets? + +Yes. Baserow is built with a high-performance architecture designed to handle large volumes of data efficiently. Self-hosted deployments can be scaled to meet your specific performance requirements. + +### Can I migrate data from other platforms to Baserow? + +Yes. Baserow supports importing data from various sources, including CSV files, Excel spreadsheets, and Airtable. You can also use the API to programmatically migrate data from other systems. + +## What's next? + +Now that you understand Baserow's core capabilities, you're ready to start building: + +1. **[Quick start guide][11]**: Create your first database in 5 minutes +2. **[Set up your account][12]**: Configure your workspace and settings +3. **[Learn key concepts][13]**: Understand workspaces, databases, tables, and fields +4. **[Keyboard shortcuts][14]**: Work faster with productivity shortcuts + +## Related content + +- [Introduction to databases in Baserow][1] +- [Introduction to Application Builder][2] +- [Integrations and automation overview][9] +- [Enterprise license overview][7] +- [Baserow roadmap][15] + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: /user-docs/intro-to-databases + [2]: /user-docs/application-builder-overview + [3]: https://baserow.io/user-docs/dashboards-overview + [4]: https://baserow.io/user-docs/workflow-automation + [5]: https://baserow.io/user-docs/configure-generative-ai + [6]: https://baserow.io/user-docs/set-up-baserow + [7]: /user-docs/enterprise-license-overview + [8]: https://api.baserow.io/api/redoc/ + [9]: /user-docs/database-api + [10]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/3bf0d6eb-944a-4fab-8e83-ae0b9212929b/powerful_relations_as_easy_as_a_spreadsheet.webp + [11]: /user-docs/how-to-get-started-with-baserow + [12]: /user-docs/set-up-baserow + [13]: /user-docs/learn-baserow-basic-concepts + [14]: /user-docs/baserow-keyboard-shortcuts + [15]: /product/roadmap",,baserow_user_docs,https://baserow.io/user-docs/baserow-basics +146,Database snapshots,snapshots,Baserow database snapshots for easy recovery,"# Snapshots + +Snapshots are complete database copies that capture your entire database at a specific moment, enabling you to restore data to that exact state if needed. + +This guide covers how to create, restore, and manage Baserow snapshots for point-in-time database backups and disaster recovery. + +![Snapshot in Baserow][1] + +## What are snapshots? + +Snapshots create full backups of databases that can be restored to recover from data loss or corruption. Unlike [trash recovery](/user-docs/data-recovery-and-deletion), snapshots persist until you delete them, providing long-term backup protection for critical databases. + +**Snapshots include:** +- All tables and their data (every row, field, and value) +- All views and view configurations (filters, sorts, field visibility) +- Field types and configurations +- [Link to table](/user-docs/link-to-table-field) relationships between tables +- All file attachments and images + +**Snapshots do NOT include:** +- Other databases in the same workspace +- [Webhooks](/user-docs/webhooks) configurations + +## Snapshots vs other backup methods + +Different backup methods serve different purposes: + +| Method | Retention | Scope | Restore speed | Best for | +|--------|-----------|-------|---------------|----------| +| **Snapshots** | Until deleted | Entire database | Fast | Complete database recovery | +| **[Trash](/user-docs/data-recovery-and-deletion)** | 3 days | Individual items | Instant | Accidental deletions | +| **[Table export](/user-docs/export-tables)** | Manual storage | Single table | Slow (re-import) | Sharing data externally | +| **[Workspace export](/user-docs/export-workspaces)** | Manual storage | All databases | Slow (re-import) | Migration between instances | +| **[Undo/Redo](/user-docs/data-recovery-and-deletion#undo-and-redo-actions)** | Session only | Recent actions | Instant | Immediate mistakes | + +## How to create a snapshot + +Snapshots capture your entire database at the current moment. Create snapshots before major changes or on regular schedules for ongoing protection. + +1. Navigate to your workspace and locate the database +2. Click the **three-dot menu (⋮)** next to the database name +3. Select **Snapshots** from the dropdown +4. Click **Create snapshot** in the snapshots modal +5. Enter a **descriptive name** for the snapshot (e.g., ""Before Q4 migration"" or ""Pre-formula update 2024-01-15"") +6. Click **Create** + +> **Snapshot creation time:** Large databases may take several minutes to snapshot. You'll see a progress indicator and can continue working in other databases while the snapshot completes. + +## How to restore a snapshot + + 1. Click the **three-dot menu (⋮)** next to your database name + 2. Select **Snapshots** from the dropdown + 3. Find the snapshot you want to restore in the list + 4. Select **Restore snapshot** + +All tables, views, rows, and fields reflect the snapshot moment. Data added after the snapshot is not visible. Files and attachments reflect to snapshot versions + +## Manage snapshots + +### View all snapshots + +1. Click the **three-dot menu (⋮)** next to your database +2. Select **Snapshots** +3. The modal shows all snapshots with the Snapshot name, Creation date and time, and who created the snapshot. + +### Delete snapshots + +Remove outdated or unnecessary snapshots to free up storage and reduce clutter. + + 1. Open the **Snapshots** modal for your database + 2. Find the snapshot to delete + 3. Select **Delete snapshot** + 4. Confirm the deletion + +> **Warning:** Deleted snapshots cannot be recovered. Ensure you don't need the snapshot before deleting it. Consider keeping at least one recent snapshot for emergency recovery. + +### Cancel snapshot creation + +For large databases, snapshot creation can take several minutes. Cancel in-progress snapshots if needed. + +1. Open the **Snapshots** modal +2. Find the in-progress snapshot (shows progress indicator) +3. Click **Cancel** next to the snapshot job +4. Confirm cancellation + +![Canceling snapshot creation in Baserow](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/3e1b618f-ffc5-4a11-9eac-d95cd8ebd624/job_cancellation_for_snapshots.webp) + +Canceled snapshots are discarded and don't count toward storage. The cancellation helps manage system resources when creating snapshots for very large databases. + +## Snapshot permissions + +### Who can create snapshots + +Only workspace members with [Admin roles](/user-docs/permissions-overview) can create, restore, list, and delete snapshots. Lower permission levels (Builder, Editor, Commenter, Viewer) cannot access snapshot functionality. + +### Permissions preserved in snapshots + +When you create a snapshot, all database and table permissions are captured: +- Workspace member role assignments +- [Team-level permissions](/user-docs/create-and-manage-teams) +- [Database-level role assignments](/user-docs/assign-roles-at-database-level) +- [Table-level role assignments](/user-docs/assign-roles-at-table-level) + +## Why use snapshots? + +Snapshots provide backup and recovery that goes beyond basic export/import workflows. + +**Point-in-time recovery:** Restore databases to exact states from specific moments. Critical before major data migrations, bulk updates, or structural changes. + +**Disaster recovery:** Protect against accidental bulk deletions, corrupted imports, or failed integrations. Snapshots let you roll back entire databases when exports would be too slow. + +**Compliance and auditing:** Many industries require point-in-time backup capabilities for compliance. Snapshots provide timestamped, complete database copies for audit trails. + +**Testing and staging:** Create snapshots before testing new workflows, formulas, or integrations. Restore quickly if tests damage data or structures. + +**Version control for databases:** Maintain snapshots at project milestones or release points. Roll back to previous versions if new changes cause issues. + +**Use snapshots when:** +- You need guaranteed recovery points beyond 3 days +- Database recovery speed is critical (faster than re-importing exports) +- Compliance requires point-in-time backups +- You're making risky bulk changes to production databases +- You need to preserve the exact database state, including permissions + +**Use exports when:** +- You need to share data with external parties +- You're migrating to different Baserow instances +- You want backups stored outside Baserow +- You're on Premium or lower plans without snapshot access + +### When to create snapshots + +**Before bulk operations:** +- Large imports that modify existing data +- Bulk deletions or field removals +- Database structure changes (adding/removing tables) +- Complex formula updates affecting many fields + +**Regular intervals:** +- Daily for critical production databases +- Weekly for regularly updated databases +- Monthly for reference or historical databases + +**Before major milestones:** +- Product releases or launches +- End of quarter/year +- Migration to new systems +- Integration installations + +**Before testing:** +- New workflow implementations +- Third-party integration tests +- Experimental formula or automation changes + +## Frequently asked questions + +### How much storage do snapshots use? + +Snapshots store complete database copies, so they consume storage equal to the database size at snapshot time. Large databases with many files create large snapshots. Monitor snapshot storage and delete outdated snapshots to manage storage costs. + +### How long does snapshot creation take? + +Creation time depends on the database size. Small databases (under 100 rows) snapshot in seconds. Large databases (10,000+ rows with files) may take several minutes. You can continue working in other databases while snapshots are created in the background. + +### Can I schedule automatic snapshots? + +Not currently through the Baserow UI. For automated snapshots, use the [Baserow API](/user-docs/database-api) with external automation tools or cron jobs. + +### Can I restore snapshots to different databases or workspaces? + +No. Snapshots restore only to the database they were created in. To copy database structure or data to different workspaces, use [workspace exports](/user-docs/export-workspaces) and imports instead. + +### Do snapshots include deleted items from trash? + +No. Snapshots capture the database's current state, which doesn't include items in [trash](/user-docs/data-recovery-and-deletion). Items deleted before the snapshot was created won't appear in snapshot restorations. + +### Can I download snapshots for offline storage? + +Not directly. Snapshots are stored within Baserow's infrastructure. For offline backups, use [table exports](/user-docs/export-tables) or [workspace exports](/user-docs/export-workspaces), which download to your local system. Consider combining both approaches for comprehensive backup strategies. + +### How many snapshots can I keep per database? + +Generally, there's no hard technical limit, but storage costs and management complexity increase with many snapshots. A common practice is keeping daily snapshots for a week, weekly for a month, and monthly for a year. + + + +## Related resources + +### Backup and recovery +- [Delete and recover data](/user-docs/data-recovery-and-deletion) - Trash and undo/redo +- [Export tables](/user-docs/export-tables) - Download table backups +- [Export workspaces](/user-docs/export-workspaces) - Complete workspace backups +- [Import data](/user-docs/import-data-into-an-existing-table) - Restore exported data + +### Permissions +- [Permissions overview](/user-docs/permissions-overview) - Role-based access control +- [Assign roles at database level](/user-docs/assign-roles-at-database-level) - Database permissions +- [Create and manage teams](/user-docs/create-and-manage-teams) - Team-based access + +### Account management +- [Account settings overview](/user-docs/account-settings-overview) - Manage your account +- [Password management](/user-docs/password-management) - Account security + +### Plans and features +- [Pricing plans](/user-docs/pricing-plans) - Feature availability by plan + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/d07d5498-356c-483e-b74e-981db2224de9/Snapshot.jpg",,baserow_user_docs,https://baserow.io/user-docs/snapshots +147,Notifications,notifications,Baserow real-time notifications overview,"# Notifications + +Notifications keep you informed about workspace activity, mentions, form submissions, and system issues without constantly checking for updates. + +This guide covers how to view, manage, and configure Baserow notifications, including in-app alerts, email notifications, and system deactivation warnings. + +## What are Baserow notifications? + +Notifications alert you to important workspace activity and changes. Receive updates when team members mention you in comments, invite you to workspaces, submit forms, or when system integrations need attention. Notifications appear in-app and optionally via email based on your preferences. + +**Notification types:** + - **[Mentions and comments][1]** - When someone @mentions you or comments on rows you're watching + - **[Workspace invitations][2]** - When you're invited to join a workspace + - **[Collaborator assignments][3]** - When you're added as a collaborator on specific rows + - **[Form submissions][4]** - When someone submits a form you own (opt-in) + - **Deactivation alerts** - When webhooks, data syncs, or integrations fail + - **Product updates** - When new Baserow versions release (optional) + + + +## View in-app notifications + +In-app notifications appear in the Baserow interface and persist until you read or clear them. + +### Access notifications panel + +1. Click **Notifications** in the sidebar +2. A modal opens showing all notifications chronologically +3. **Unread notifications** display with: Blue dot indicator, distinct background color, and badge count on the Notifications tab + +### Interact with notifications + +**Click any notification** to jump directly to the relevant content (row, comment, workspace invitation). + +**Mark all as read** - Removes unread indicators from all notifications at once. + +**Clear all** - Permanently removes all notifications from the panel. + +Unread notifications remain visible until you mark them read or clear them. The badge count on the Notifications tab shows your unread count. + + +![Notifications panel in Baserow](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/c121d580-9411-4e37-820a-dea8fb06b0f2/Notifications.png) + +## Email notifications + +Receive notifications via email sent to your Baserow account email address. + +### Configure email notifications + +1. Click your **workspace icon** in the top-right corner +2. Select **Settings** +3. Click the **Email notifications** tab +4. Choose your preferred **frequency**: + - **Instantly** - Email sent immediately for each notification + - **Daily** - Single digest email once per day (midnight UTC) + - **Weekly** - Single digest email once per week + - **Never** - No email notifications (in-app only) + +### Email notification frequency + +**Instant notifications:** Receive a separate email immediately each time something happens (mention, invitation, form submission). + +**Daily/Weekly digests:** Batched notifications sent in a single email at scheduled times. Each digest includes up to 10 notifications. If you have more than 10, the email displays ""Plus X more notifications"" with the count of additional items. + +**Timing:** Daily emails are sent at midnight UTC (Coordinated Universal Time). Self-hosted instances can adjust the timing and day for digests in instance settings. + +### What triggers email notifications + +Emails are sent when: + - Someone @mentions you in a [comment](/user-docs/row-commenting) + - You're invited to join a workspace + - You're added as a [collaborator](/user-docs/collaborator-field) to a row + - Someone submits a form you own (if enabled) + - Webhooks, data syncs, or integrations fail (deactivation alerts) + +![Email notification settings](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/d1e9a641-ebc5-433c-a653-c88ccf77729f/Email%20notifications.png) + +## Notification types explained + +### Mentions and comments + +Receive notifications when team members mention you in comments or when activity occurs on rows you're tracking. + +**@Mention notifications:** Any time someone types @yourname in a comment, you receive a notification. + +**Row tracking:** [Subscribe to row comments](/user-docs/row-commenting#track-comments) to receive notifications for all comments on that row, even without being mentioned. Useful for following important records or conversations. + +Learn more: [Row comments and mentions](/user-docs/row-commenting) + +### Workspace invitations + +When workspace admins invite you to join their workspace, you receive a notification with an accept/decline option. Click the notification to review the invitation and respond. + +### Collaborator assignments + +When someone adds you as a collaborator to specific rows using the [collaborator field](/user-docs/collaborator-field), you receive a notification. Collaborator notifications help you track which records require your attention or action. + +### Form submission notifications + +Get alerts when someone submits forms you own. This feature is **opt-in per form**. + +**Enable form notifications:** +1. Open the form in edit mode +2. Scroll to the bottom of the form editor +3. Toggle **""Receive form notifications""** on + +![Form submission notification settings](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/e6fa54e4-dcc8-4ba5-9675-e3f53bea5e38/Notifications.png) + +Useful for customer feedback forms, lead generation, event registrations, or any form requiring prompt response. + +Learn more: [Form view](/user-docs/guide-to-creating-forms-in-baserow) + +### Deactivation notifications + +System notifications alert you when integrations or automations stop working, helping maintain smooth operations. + + - **[Webhook](/user-docs/webhooks) failures:** Receive alerts after webhooks fail 4 consecutive times and become inactive. Helps identify integration issues early before they impact workflows. + - **Payload size limits:** Get notified when webhooks can't deliver complete data due to size restrictions. The system sends partial data (first 1,000 records) and notifies you of the limitation. + - **[Data sync][5] interruptions:** Alerts when scheduled data synchronizations fail due to authentication issues, endpoint changes, or technical problems. Enables quick resolution of sync failures. + +These deactivation notifications help prevent silent failures and data sync gaps. + +## Frequently asked questions + +### Why am I not receiving email notifications? + +Check these common issues: +1. **Email frequency set to ""Never""** - Change to Instant, Daily, or Weekly in Settings > Email notifications +2. **Email in spam folder** - Check spam/junk and mark Baserow emails as ""not spam"" +3. **Incorrect email address** - Verify your account email in Settings > Account +4. **Self-hosted email not configured** - Contact your instance administrator about SMTP settings + +### Can I turn off notifications for specific workspaces? + +Not directly. Email notification preferences apply globally across all workspaces. To reduce notifications from specific workspaces, avoid subscribing to row comments and disable form notifications on forms you don't need to monitor actively. + +### How do I stop getting notifications about a specific row? + +Open the row, find the comment section, and click the bell icon or ""Unsubscribe"" option. This stops notifications for that row's comments unless you're directly mentioned. + +### What happens to notifications when I leave a workspace? + +When you leave a workspace, you stop receiving new notifications about that workspace's activity. Existing notifications for that workspace remain in your notification panel until you clear them. + +### Can workspace admins control my notification settings? + +No. Notification preferences are personal account settings that only you control. Workspace admins cannot change your email frequency, subscribe you to rows, or enable form notifications on your behalf. + +### Do notifications work on mobile devices? + +In-app notifications work on mobile browsers when you access Baserow. Email notifications work on any device with email access. Baserow doesn't currently have native mobile push notifications through app stores. + +### How long are notifications retained? + +In-app notifications persist indefinitely until you manually clear them. Email notifications follow standard email retention (your email provider's policies). Very old notifications may be archived on self-hosted instances based on database maintenance policies. + +## Related resources + +### Collaboration features +- [Row comments and mentions](/user-docs/row-commenting) - Discussion and @mentions +- [Collaborator field](/user-docs/collaborator-field) - Assign work to team members +- [Collaboration overview](/user-docs/managing-workspace-collaborators) - Team collaboration guide + +### Workspace management +- [Add workspace collaborators](/user-docs/working-with-collaborators) - Invite team members +- [Manage workspace members](/user-docs/manage-workspace-permissions) - Member permissions +- [Permissions overview](/user-docs/permissions-overview) - Access control + +### Forms and automation +- [Form view](/user-docs/guide-to-creating-forms-in-baserow) - Create data collection forms +- [Webhooks](/user-docs/webhooks) - Automate with external integrations + +### Account settings +- [Account settings overview](/user-docs/account-settings-overview) - Manage your account +- [Email notifications setup](/user-docs/account-settings-overview#email-notifications) - Configure email preferences + +--- + + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow.io/user-docs/row-commenting + [2]: https://baserow.io/user-docs/working-with-collaborators + [3]: https://baserow.io/user-docs/collaborator-field + [4]: https://baserow.io/user-docs/guide-to-creating-forms-in-baserow + [5]: https://baserow.io/user-docs/data-sync-in-baserow",,baserow_user_docs,https://baserow.io/user-docs/notifications +148,Field summaries,footer-aggregation,Field summaries in Baserow grid view,"# Field summaries in Grid View + +Field summaries in Baserow transform raw data into instant insights; calculating totals, averages, and statistics automatically at the bottom of each column so you understand your data at a glance without formulas or exports. + +This guide explains how to use field summaries (footer aggregations) to calculate and display totals, averages, counts, and other statistical insights at the bottom of Grid View columns. + + +## Overview + +Field summaries display calculated values in the footer row at the bottom of Grid View columns, providing instant statistical insights about your data. These calculations update automatically as your data changes, giving you real-time analytics without creating separate calculation fields or exporting to spreadsheets. + +Each field type offers contextually relevant summary options; number fields calculate sums and averages, date fields show earliest and latest dates, boolean fields count checked items, and text fields count unique values. You can apply different summaries to different fields, creating a dashboard-like footer that answers key questions about your table instantly. + +Summaries respect active filters and sorts, meaning they calculate based on visible rows only. This dynamic behavior lets you analyze filtered subsets without changing your table structure or creating duplicate views. + + + +![Field summaries in Baserow Grid View](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/901c4fb0-56f6-4933-b768-5ef6a09446ac/footer%20baserow.webp) + +## When to use field summaries + +**Financial tracking:** Display total revenue, average order value, or count of paid invoices instantly at the bottom of your sales table. + +**Project management:** Show total hours logged, count of incomplete tasks, or percentage of completed items across your team. + +**Inventory management:** Calculate total stock quantity, count items below reorder point, or show the most recent stock update date. + +**Data quality monitoring:** Identify empty fields needing completion, count unique customers, or find outlier values with min/max. + +**Performance analysis:** Track average ratings, median response times, or standard deviation to understand data distribution. + + + +## How to add a field summary + +Apply summaries to any field in Grid View through the footer row. + +**To add a summary:** + +1. Open your table in [Grid View][1] +2. Scroll to the bottom of your table to see the footer row +3. Hover over the **footer cell** beneath the field you want to summarize +4. Click the footer cell to open the summary menu +5. Select your desired summary function from the list +6. The calculated value appears immediately in the footer + +**To change a summary:** Click the footer cell again and select a different summary option. The value updates instantly. + +**To remove a summary:** Click the footer cell and select ""None"". + +## Summary types by field category + +> Lookup fields do not support summaries. For lookup data analysis, create a rollup field with aggregation instead. + +**Universal options:** None, Empty, Filled, Percent empty, Percent filled, Unique, and Distribution summary options. + +### Summary options for text and selection fields + +Text fields (Single line text, Long text, Email, URL, Phone number), selection fields (Single select, Multiple select), and file fields offer data quality summaries, completeness tracking: + +| Summary | Calculates | Example use | +|---------|-----------|-------------| +| **Empty** | Count of blank cells | Missing information tracking | +| **Filled** | Count of populated cells | Data entry progress, Records with values, completed entries | +| **% Empty** | Percentage blank | Data quality score | +| **% Filled** | Percentage populated | Completion percentage | +| **Unique** | Distinct values | Customer count, category count, Number of different values | + +> Link-to-table, Multiple select and File fields don't support Unique and Distribution summaries. + +### Summary options for count, number and rating fields + +Number, Count, Rollup and rating fields offer comprehensive statistical calculations: + +| Summary | Calculates | Example use | +|---------|-----------|-------------| +| **Sum** | Total of all values | Total revenue, total hours | +| **Average** | Mean value | Average order value, average rating | +| **Median** | Middle value | Typical salary (ignores outliers) | +| **Min** | Smallest value | Lowest price, minimum inventory | +| **Max** | Largest value | Highest price, maximum capacity | +| **Std Deviation** | Spread around mean | Data variability, quality consistency | +| **Variance** | Squared deviation | Statistical analysis, risk assessment | + +> Duration fields don't support Variance, Std Deviation, Average and Median summaries. + +### Summary options for date and time fields + +Date, Created On, and Last Modified fields show temporal boundaries: + +| Summary | Calculates | Example use | +|---------|-----------|-------------| +| **Earliest Date** | Oldest date in field | Project start date, first customer | +| **Latest Date** | Newest date in field | Most recent activity, latest update | + +### Summary options for boolean fields + +Boolean (checkbox) fields track checked vs. unchecked states, completion tracking, binary analysis: + +| Summary | Calculates | Example use | +|---------|-----------|-------------| +| **Checked** | Count of checked boxes | Completed tasks, active items | +| **Unchecked** | Count of unchecked boxes | Pending tasks, inactive items | +| **% Checked** | Percentage checked | Completion rate, adoption rate | +| **% Unchecked** | Percentage unchecked | Remaining work, gap analysis | + +**Use case:** Track project completion by showing ""% Checked"" on a ""Task Complete"" boolean field; instantly see 73% of tasks are done. + + + +## How summaries work with filters and groups + +### Summaries with active filters + +Field summaries calculate based on **visible rows only**. When you apply filters, summary values automatically update to reflect the filtered subset: + +This dynamic behavior lets you analyze filtered data without creating separate views or manual calculations. + +### Summaries with grouped rows + +When using [row grouping][28], summaries calculate across **all visible rows** in the view, not per group. The footer shows one aggregate value for the entire filtered dataset. + +For group-level summaries, each group header displays its own row count, but statistical summaries appear only in the main footer. + +## Field summaries in public views + +When you [share a Grid View publicly][4], any field summaries you've configured display to public viewers automatically. This helps present key metrics without exposing full datasets. + +![Field summaries in public Grid Views](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/d7d767e6-6285-4a69-b7ab-cc30d2a63ec2/footer%20aggregations%20in%20public%20grid%20views.png) + +> **Privacy consideration:** Only summaries you've explicitly configured appear publicly; there are no default summaries, so you control exactly what metrics public viewers see. + +**Use case:** Share a product inventory view publicly showing ""Total Products (Count)"" and ""Average Price"" without revealing individual product margins or costs. + +## Frequently asked questions + +### Can I use field summary values in formulas or calculations? + +No, field summaries are display-only calculations in the Grid View footer. They can't be referenced in formula fields or other calculations. To use aggregated values in formulas, create a [Rollup field][29] that performs the aggregation at the data layer. + +### Do field summaries calculate on all rows or just visible rows? + +Field summaries calculate on **visible rows only**; respecting active filters, sorts, and search results. This dynamic behavior lets you analyze subsets of your data by filtering first, then viewing the summary of filtered results. + +### Can I show different summaries in different views of the same table? + +Yes, field summaries are view-specific. You can configure ""Sum"" in one Grid View, ""Average"" in another view, and no summary in a third view; all for the same field in the same table. + +### Why can't I add summaries to my lookup field? + +Lookup fields display data from linked tables and don't support direct summaries. Instead, create a [Rollup field][29] that aggregates the data from the linked table; rollups support all aggregation functions like sum, average, count, etc. + +### Do summaries work in other view types like Gallery or Kanban? + +No, field summaries are exclusive to Grid View. Other view types don't display the footer row where summaries appear. If you need summary data in other views, consider creating [formula fields][25] or rollup fields that display the aggregated values. + +### How do I export field summary values along with my data? + +Field summaries don't export with data; they're calculations displayed in the view interface only. To include aggregated values in exports, create [formula fields][25] or [rollup fields][29] that calculate at the data layer, then export the table including those calculated fields. + +## Related content + +- [Grid View guide][1] - Learn about Grid View features and capabilities +- [Rollup fields][29] - Aggregate data from linked tables +- [Formula fields][25] - Create calculated values at the data layer +- [Filtering in Baserow][6] - Filter data before viewing summaries +- [Grouping rows][28] - Organize data with summaries +- [Field types overview][field-types] - Understand available field types + +--- + + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + +[1]: /user-docs/guide-to-grid-view +[4]: /user-docs/guide-to-grid-view#share-grid-view +[6]: /user-docs/filters-in-baserow +[25]: /user-docs/understanding-formulas +[28]: /user-docs/group-rows-in-baserow +[29]: /user-docs/rollup-field +[field-types]: /user-docs/baserow-field-overview",,baserow_user_docs,https://baserow.io/user-docs/footer-aggregation +149,Export a view,export-a-view,Export Baserow database views effortlessly,"# Export views from Baserow + +View exports let you share exactly what you see, filtered, sorted, and formatted, without exposing entire tables. + +This guide covers how to export filtered, sorted, or customized Grid views to CSV, Excel, JSON, or XML for sharing specific data subsets. + +> View export is currently available only for Grid views. To export from other view types, switch to Grid view first or use [table export](/user-docs/export-tables). + +![Selecting a view to export](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/729334bf-e50d-4dd1-a905-6a8459719bb5/Select%20the%20view%20to%20export.webp) + +## What are view exports? + +View exports capture exactly what you see in a specific view, including filters, sorts, hidden fields, and row selections. This makes view exports ideal for creating targeted reports, sharing relevant data with stakeholders who don't need full table access, or generating recurring reports with consistent formatting. + +Unlike [table exports](/user-docs/export-tables) that contain all data, view exports give you precise control over what information leaves Baserow. + +## View exports vs table exports + +Choose the right export method based on what you need to share: + +| Aspect | View exports | Table exports | +|--------|--------------|---------------| +| **Data included** | Only visible, filtered rows | All rows regardless of filters | +| **Fields included** | Only visible columns | All fields including hidden ones | +| **Row order** | Matches view sort | Default table order | +| **Available from** | Grid views only | Any view type | +| **Best for** | Targeted reports, specific datasets | Backups, complete data transfers | +| **Updates with filters** | Yes, respects current filters | No, always exports everything | + +**When to use view exports:** +- Monthly reports with consistent filtering +- Sharing data with external stakeholders +- Department-specific datasets from master tables +- Recurring exports with stable formatting + +**When to use table exports:** +- Complete data backups +- Migrating entire datasets to other systems +- Archiving comprehensive historical data +- When you need everything without filtering + +Learn more: [Export entire tables](/user-docs/export-tables) + +## How to export a view + +View exports work through the view settings menu, giving you format and configuration options before downloading. + +### Step-by-step process + +1. **Open the view** you want to export +2. **Click the ellipsis `•••`** beside the view name to open view settings +3. **Select ""Export view""** from the menu +4. **Confirm the view selection** in the dropdown (it should show your current view) +5. **Choose your export format** (CSV, Excel, JSON, or XML) +6. **Configure format-specific options** if applicable (CSV delimiters, encoding) +7. **Click ""Export""** to download the file to your device + +The exported file respects all view configurations active when you initiate the export. Filters, sorts, hidden fields, and row groupings all influence the final export content. + +## Export formats and options + +Each format serves different purposes and offers specific configuration options. + +### CSV (Comma-Separated Values) + +CSV is the most configurable format with options for delimiters and encoding. When exporting to CSV, you can customize how data is structured. + +**Column separator options:** The default comma (`,`) works for most uses, but you can choose alternatives. Use semicolon (`;`) for European systems where commas indicate decimals, pipe (`|`) when data contains many commas naturally, tab (``) for tab-delimited files preferred by some database systems, or record separator (30) and unit separator (31) for specialized technical requirements. + +**Encoding options:** UTF-8 (default) handles all international characters and emojis correctly, making it the best choice for most scenarios. Latin-1 may be needed for legacy systems that don't support UTF-8, while other encodings exist for specific regional or technical requirements. + +**Header row:** Baserow includes field names as the first row by default, which helps when importing into other systems. Most applications expect headers, but you can disable this option if you need pure data without column labels. + +### Excel (.XLSX) + +Excel format preserves formatting better than CSV and opens natively in Microsoft Office. It supports multiple sheets, though Baserow exports single sheets. Excel automatically handles date and number formatting based on your system locale. Choose Excel when recipients primarily use Microsoft Office or when you need better formatting preservation than CSV provides. + +![Exporting view to Excel format](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/c65f6d43-55ae-45f1-8086-d132f868b6ec/excel_export.webp) + +### JSON and XML + +Both JSON and XML create structured data files for programmatic use. JSON is more concise and works better with web applications and modern APIs. XML provides hierarchical structure and may be required by enterprise systems or legacy integrations. Choose these formats when exporting for developers, API integration, or systems that specifically require structured data rather than spreadsheet formats. + +### Export files (grouped by row) + +The ""Export files"" option creates a downloadable archive containing all files and images from file fields in your view, organized by row ID. Each row gets its own folder, making it easy to see which files belong to which records. This is particularly useful when you need to extract attachments, images, or documents from your table for offline use, archival purposes, or sharing with people who don't need the structured data, just the files themselves. + +## What gets exported from views + +**Included in view exports:** All visible field values in rows that pass current filters, field names as column headers (unless disabled), row order based on active sorts, and data formatted according to field types. + +**Excluded from view exports:** Hidden fields don't appear even if they contain data, filtered-out rows are completely omitted, [row comments](/user-docs/row-commenting) and mentions aren't included, and [row revision history](/user-docs/row-change-history) stays in Baserow. Formula fields export their calculated values as static data, not the formulas themselves. + +**View-specific considerations:** Personal views export only for the user who created them, since other users can't access personal view configurations. Collaborative views can be exported by anyone with appropriate table permissions. View colors and conditional formatting don't export; only the underlying data values. + +## Frequently asked questions + +### Can I allow public viewers to export data from a shared link? + +Yes. When you [share a Grid view publicly](/user-docs/public-sharing), you can enable the **""Allow export on shared view""** toggle in the ""Share view"" options. This adds an export option to the public link, allowing non-workspace members to export the filtered, visible data. + +### Why can't I export my Kanban or Calendar view? + +View export is currently limited to Grid views only. To export data from Kanban, Calendar, Gallery, or Timeline views, switch to a Grid view first or use the table export option, which works regardless of the current view type. The exported data will be the same; only the export access point differs. + +### Do exported views include hidden fields? + +No, hidden fields are excluded from view exports. If you've hidden fields for privacy or simplicity, they won't appear in exported files. To include all fields, create a view with all fields visible or use table export instead of view export. + +### Can I export multiple views at once? + +No, Baserow exports one view at a time. To export multiple views from the same table, repeat the export process for each view. Each export produces a separate file with that view's specific configuration. + +### What happens if I modify the view after starting an export? + +Exports capture the view state at the moment you click ""Export."" Changes made to filters, sorts, or field visibility after initiating export don't affect the download. The exported file reflects the view configuration that existed when export began. + +### How do I create consistent recurring exports? + +Create a dedicated view configured specifically for your recurring export needs with appropriate filters, sorts, and field visibility. Name it clearly (e.g., ""Monthly Report Export"") and use this same view each time. The consistent view configuration ensures your exports maintain the same structure and formatting across reporting periods. + +### Can I export just the files without the data? + +Yes, use the ""Export files"" option, which creates a zip archive containing only files from file fields, organized into folders by row ID. This gives you all the uploaded files, images, and attachments without the structured table data. The folder structure helps you identify which files came from which records. + +## Related resources + +### Export and import +- [Export entire tables](/user-docs/export-tables) - Complete data exports +- [Import data into tables](/user-docs/import-data-into-an-existing-table) - Bring data back into Baserow +- [Database API](/user-docs/database-api) - Automate exports programmatically + +### View configuration +- [Create custom views](/user-docs/create-custom-views-of-your-data) - Build export-optimized views +- [View customization options](/user-docs/view-customization) - Configure filters and sorts +- [Filters in Baserow](/user-docs/filters-in-baserow) - Prepare targeted exports + +### View types +- [Grid view guide](/user-docs/guide-to-grid-view) +- [Collaborative views](/user-docs/collaborative-views) +- [Personal views](/user-docs/personal-views) + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account",,baserow_user_docs,https://baserow.io/user-docs/export-a-view +150,Advanced row filter,advanced-filtering,Baserow advanced filtering by field values,"# Advanced filtering in Baserow + +Advanced filtering in Baserow unlocks database-level querying power; combining multiple conditions with AND/OR logic and nested groups to find exactly what you need in tables with thousands of records. + +This guide explains how to create complex filters using condition groups, nested logic, and combined criteria to build sophisticated data queries without writing code. + + + +## Overview + +Advanced filtering extends basic filtering by allowing you to create condition groups, collections of filters combined with logic operators that can be nested for complex queries. While basic filters apply simple single or multi-condition rules, advanced filtering lets you build sophisticated ""if-this-AND-that-OR-something-else"" queries. + +Condition groups work like parentheses in mathematical expressions, letting you control how filters combine. You can create filters that say ""show me (high-priority AND overdue) OR (medium-priority AND assigned-to-me)"" to capture nuanced data patterns that simple filters can't express. + +Advanced filtering applies across Baserow features including row filtering, [row coloring][4] conditions, and [conditional form fields][5], giving you consistent query power throughout the platform. + +![Advanced filtering interface in Baserow](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/38286f1c-3b26-47bc-a22b-8e6f53a84e9a/Advanced%20filtering.png) + +## Understanding condition groups + +Condition groups are collections of filters connected by AND or OR logic that evaluate together. Each group produces a true/false result, and these groups can be combined with other groups or individual filters to create complex queries. + +### AND vs. OR logic behavior + +| Logic type | Behavior | Result | Example | +|------------|----------|--------|---------| +| **AND** | All conditions must be true | Stricter, fewer results | ""Status = In Progress"" AND ""Priority = High"" (only rows matching both) | +| **OR** | Any condition can be true | Permissive, more results | ""Status = Blocked"" OR ""Status = At Risk"" (rows matching either) | + +### Why use condition groups? + +**Simple filters:** Priority = High *(shows all high-priority items)* + +**Condition group:** (Priority = High AND Status = In Progress) OR (Priority = Critical) *(shows high-priority items only if in progress, but shows all critical items regardless of status)* + +The grouped logic lets you express ""show me this specific combination OR that other thing"" in ways that flat filter lists cannot. + +## When to use advanced filtering + +**Complex business rules:** Display records that meet multi-part criteria like ""(customer tier = enterprise AND contract value > $100k) OR (renewal date in next 30 days)"". + +**Exception handling:** Show standard items with one set of conditions but also include exceptions""(status = active AND last-contact < 30 days ago) OR (vip-customer = true)"". + +**Multi-team workflows:** Combine department-specific conditions like ""(department = sales AND stage = negotiation) OR (department = support AND priority = urgent)"". + +**Date range combinations:** Create complex temporal filters like ""(created this year AND modified this month) OR (flagged-for-review = true)"". + +**Data validation:** Find records that violate business rules ""(required-field is empty AND status != draft) OR (approval-date is empty AND status = approved)"". + +## How to create condition groups + +Build condition groups by adding filters and organizing them with logic operators. + +**To create a basic condition group:** + +1. Open your table and click the **Filter** button in the view toolbar +2. Click **+ Add Filter** to add your first condition +3. Select a field, operator, and value for the first filter +4. Click **+ Add Filter** again for the second condition +5. Choose **And** or **Or** from the logic dropdown between filters +6. Continue adding filters as needed + +The table updates in real-time to show only rows matching your condition group. + +**To create nested condition groups:** + +1. Open your table and click the **Add filter group** button in the view toolbar +2. Select filters you want to group together +3. Click to create a subgroup with its own AND/OR logic +4. Add additional filters or groups at the parent level +5. Mix AND/OR logic at different nesting levels + +Example nested structure: +``` +Show rows where: + (Priority = High AND Status = In Progress) + OR + (Department = Sales AND (Region = West OR Region = East)) +``` + +## Condition group nesting strategies + +| Strategy | Structure | Use case | +|----------|-----------|----------| +| **Flat groups** | All filters at same level with single logic type | Simple ""all must match"" or ""any can match"" queries | +| **Single nest** | One group combined with individual filters | ""Show exceptions OR these specific items"" | +| **Multiple groups** | Several groups at same level with OR logic | ""Show category A OR category B OR category C"" where each category has multiple conditions | +| **Deep nesting** | Groups within groups | Complex business rules with multiple layers of logic | + +## Using advanced filtering in Baserow features + +Advanced filtering powers multiple Baserow features, creating consistent behavior across the platform: + +### Row filtering + +Apply condition groups in view filters to display only rows matching complex criteria. Each view maintains independent filter configurations. See [basic filtering][1] for getting started. + +### Row coloring + +Use condition groups to [apply colors to rows][4] when they meet sophisticated criteria. Example: Color rows red when ""(status = overdue AND priority = high) OR (days-past-due > 30)"". + +### Conditional form fields + +Show or hide [form fields][5] dynamically based on condition groups. Example: Display ""Discount reason"" field when ""(customer-tier = enterprise) OR (order-value > $10k)"". + +## Combined date filters + +Date filtering supports multiple simultaneous date conditions, letting you create precise temporal ranges. + +**To create combined date filters:** + +1. Open the [filter panel][1] in your table +2. Select a [date field][6] to filter +3. Choose your first date operator (is before, is after, is on, etc.) +4. Select a date reference (today, tomorrow, yesterday, or custom date) +5. Click **+ Add Filter** to add another date condition +6. Choose a different date operator and reference +7. Set the logic (AND/OR) between date filters + +**Example: Show records due soon** +- Filter 1: Due Date ""is after"" yesterday +- Logic: AND +- Filter 2: Due Date ""is before"" tomorrow +- **Result:** Shows only items due today + +**Example: Show items from specific periods** +- Filter 1: Created Date ""in this year"" +- Logic: AND +- Filter 2: Modified Date ""in this month"" +- **Result:** Shows items created this year but modified this month + +![Combined date filters in Baserow](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/808a449f-ddd0-47d7-a782-7f79760b7bca/Multistep%20date%20filters.png) + +## Advanced filtering logic examples + +### Example 1: Sales pipeline filter +``` +Show opportunities where: + (Stage = Negotiation AND Value > $50k) + OR + (Stage = Proposal AND Days-in-stage > 14) + OR + (Owner = Current-user AND Status = Action-required) +``` +**Result:** Shows high-value negotiations, stalled proposals, and your action items. + +### Example 2: Customer health monitoring +``` +Show customers where: + (Last-purchase-date < 90 days ago AND Support-tickets > 5) + OR + (Contract-value > $100k AND Last-contact-date < 30 days ago) + OR + (Renewal-date in next 60 days AND Health-score = Red) +``` +**Result:** Identifies at-risk customers needing attention. + +### Example 3: Task prioritization +``` +Show tasks where: + (Priority = Urgent AND Status != Complete) + OR + (Due-date is today AND Assigned-to = Current-user) + OR + (Blocked = true AND Days-blocked > 3) +``` +**Result:** Your urgent tasks, today's assignments, and long-blocked items. + +## Frequently asked questions + +### What's the difference between basic and advanced filtering? + +Basic filtering uses a flat list of conditions with single AND or OR logic throughout. Advanced filtering lets you create nested condition groups with different logic at each level, enabling complex queries like ""(this AND that) OR (something else)"". + +### How many condition groups can I create? + +There's no fixed limit on nesting depth or number of groups. However, for performance and maintainability, keep filters as simple as possible while meeting your needs. Very complex filters may slow view loading on large tables. + +### Can I save and reuse condition groups? + +Condition groups are saved with each view. To reuse a complex filter, duplicate the view or create a template view with your filter configuration, then customize it for new use cases. + +### Do condition groups work with all field types? + +Yes, condition groups support all field types and their respective operators. You can mix different field types within the same group; for example, combining text, date, and number filters in one condition group. + +### Can I use condition groups in view filters and row coloring simultaneously? + +Yes, each feature maintains its own independent condition groups. Your view might filter rows with one set of conditions while coloring the visible rows with completely different condition groups. + +### How do I know if my condition group is correct? + +Check the row count displayed in the filter panel to verify results. If the count seems wrong, try simplifying your filter by testing one condition at a time, then gradually adding complexity. The real-time preview helps validate your logic. + +## Related content + +- [Basic filtering in Baserow][1] - Learn fundamental filtering concepts +- [Row coloring][4] - Apply conditional colors with advanced filters +- [Form conditional fields][5] - Dynamic forms using condition groups +- [Date and time fields][6] - Understand date filtering options +- [View customization][9] - Explore other view configuration features +- [Field configuration options][8] - Learn about field types and operators + +--- + + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + +[1]: /user-docs/filters-in-baserow +[3]: /user-docs/intro-to-tables +[4]: /user-docs/row-coloring +[5]: /user-docs/guide-to-creating-forms-in-baserow +[6]: /user-docs/date-and-time-fields +[8]: /user-docs/field-customization +[9]: /user-docs/view-customization",,baserow_user_docs,https://baserow.io/user-docs/advanced-filtering +151,Row change history,row-change-history,Baserow row history and change tracking,"# Row change history in Baserow + +Row change history in Baserow provides complete accountability for your data, creating an automatic audit trail of every edit, addition, and deletion so you can track modifications, identify errors, and maintain data integrity without manual logging. + +This guide explains how to view, track, and interpret changes made to individual rows over time, including who made changes, what was modified, and when updates occurred. + +## Overview + +Row change history records every modification made to a row's data, creating a chronological log of edits visible within the row detail panel. Each entry shows who made the change, what fields were modified, the old and new values, and the exact timestamp of the update. + +This automatic tracking happens behind the scenes without any configuration, every time someone edits a cell, adds data, or deletes information, Baserow creates a history entry. The change log helps teams maintain accountability, troubleshoot data issues, understand how records evolved, and comply with audit requirements. + +> History retention periods vary by plan, ranging from 14 days on free plans to unlimited on self-hosted installations, ensuring you maintain the appropriate audit trail for your needs. + +![Row change history interface in Baserow](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/a382ed52-2120-46b8-965e-6c4cede5d94c/Row%20change%20history.png) + +## When to use row change history + +**Data auditing:** Track who modified customer records, financial data, or sensitive information to maintain compliance with regulations and internal policies. + +**Error investigation:** When data appears incorrect, review the history to see when the change occurred, who made it, and what the previous value was before the error. + +**Collaboration transparency:** Understand how team members contribute to shared records by seeing who added notes, updated statuses, or modified important fields. + +**Quality assurance:** Verify that review processes were followed by checking when approvals were granted, fields were validated, or required updates were completed. + +**Training and learning:** Help new team members understand workflows by showing them the evolution of sample records through the change history. + +**Conflict resolution:** When disagreements arise about data values, consult the history to establish what was changed, by whom, and when the modification occurred. + +## What changes are tracked + +| Change type | Tracked information | Example | +|-------------|---------------------|---------| +| **Field edits** | Old value → New value | Status changed from ""Draft"" to ""Published"" | +| **New data** | Empty → New value | Email address added: user@example.com | +| **Deletions** | Old value → Empty | Phone number removed | +| **Link changes** | Linked records added/removed | Project linked to Customer ABC | +| **File changes** | Files uploaded/removed | Invoice.pdf added to attachments | +| **Multiple field edits** | All changes in single update | Priority and Due Date both updated | + +**Note:** Row creation and deletion events are tracked separately in [audit logs][1], while change history focuses on modifications to existing row data. + +## How to access row change history + +View a complete timeline of changes for any row directly within the row detail panel. + +**To view change history:** + +1. Navigate to the table containing the row you want to review +2. Click the **expand icon** to [open the row detail panel][2] +3. Click the **History** tab in the top navigation of the panel +4. Scroll through the chronological list of changes + +The history displays with the most recent changes at the top, allowing you to quickly see the latest modifications. + +## Understand change history entries + +Each change entry contains specific information to help you understand what happened: + +### Author information +Shows which user or [collaborator][3] made the change. If a user account no longer exists, the entry shows their name at the time of the change to maintain audit trail integrity. + +### Change details +Provides a comprehensive summary of what was modified, including: +- Field names that were changed +- Previous values (before the edit) +- New values (after the edit) +- Number of fields modified in a single update + +### Timestamp +Displays the exact date and time when the change occurred, formatted according to your [timezone settings][4]. Timestamps use your local time zone for easy interpretation. + +## History retention by plan + +Access to historical data varies based on your Baserow subscription plan: + +### Baserow Cloud retention periods + +| Plan | Retention period | Use case | +|------|------------------|----------| +| **Free** | 14 days | Short-term change tracking, immediate error correction | +| **Premium** | 90 days | Quarterly audits, mid-term accountability | +| **Advanced** | 180 days | Regulatory compliance, long-term project tracking | + +### Baserow Self-Hosted retention + +| Plan | Default retention | Customizable | +|------|-------------------|--------------| +| **Free** | 180 days | Yes, configurable to any duration | +| **Premium** | 180 days | Yes, configurable to any duration | +| **Enterprise** | 180 days | Yes, configurable to any duration | + +You can change this to a higher (or lower) number if you wish to change the retention period. By default, there is a limit of 365 days of revisions for self-hosters, and you have the flexibility to change this limit to any other number. + +[Self-hosted installations][5] can adjust retention periods in the admin settings to meet specific compliance or storage requirements. + +> **Storage note:** Longer retention periods increase database storage requirements. Self-hosted administrators should monitor storage capacity when extending retention beyond default periods. + +## Change history vs. related features + +| Feature | Purpose | Scope | Access level | +|---------|---------|-------|--------------| +| **Row change history** | Track individual row modifications | Single row timeline | All users viewing the row | +| **[Snapshots][6]** | Full database backup at a point in time | Entire database | Admin users only | +| **[Audit logs][1]** | System-wide activity tracking | All workspace actions | Enterprise admins only | +| **[Comments][7]** | Discussion and collaboration notes | Single row context | Premium users only | + +Use row change history for detailed row-level auditing, snapshots for database-wide recovery, audit logs for enterprise security tracking, and comments for team collaboration. + + +## Frequently asked questions + +### Can I restore previous values from the change history? + +Not directly from the history panel. Change history is read-only for auditing purposes. To restore a previous value, manually copy the old value from the history entry and paste it into the current field. For database-wide restoration, use [snapshots][6]. + +### Does change history track who deleted a row? + +Row deletion events appear in [audit logs][1] for Enterprise users but not in individual row change history since the row no longer exists. Row history tracks modifications to existing rows only. + +### Can I export change history for reporting? + +Currently, change history is viewable only within the Baserow interface and cannot be exported directly. Enterprise users can access broader activity data through [audit logs][1], which can be exported for compliance reporting. + +### What happens when the retention period expires? + +Changes older than your plan's retention period are automatically purged from the history. The current data remains intact, but the historical record of how it changed is removed. Upgrade your plan or extend self-hosted retention to preserve a longer history. + +### Can I filter or search change history? + +Currently, the change history displays all modifications chronologically without filtering options. For large change logs, use the scroll bar to navigate through the timeline. Search functionality may be added in future updates. + +## Related content + +- [Row detail panel][2] - Open expanded rows to access change history +- [Snapshots][6] - Create full database backups for restoration +- [Audit logs][1] - Enterprise system-wide activity tracking +- [Row comments][7] - Collaborate with context on specific rows +- [Working with timezones][4] - Understand timestamp formatting +- [Collaborators][3] - Manage team members who appear in change history + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: /user-docs/admin-panel-audit-logs + [2]: /user-docs/enlarging-rows + [3]: /user-docs/working-with-collaborators + [4]: /user-docs/working-with-timezones + [5]: https://baserow.io/docs/installation%2Fconfiguration#backend-misc-configuration + [6]: /user-docs/snapshots + [7]: /user-docs/row-commenting",,baserow_user_docs,https://baserow.io/user-docs/row-change-history +152,Filter rows by field,filters-in-baserow,Filter rows by field values in Baserow,"# Filter rows in Baserow + +Filters in Baserow transform overwhelming datasets into focused views, letting you find exactly what you need in seconds by hiding irrelevant rows and highlighting the data that matters to your current task. + +This guide explains how to filter table data by field values using conditions, operators, and AND/OR logic to display only the rows that meet your criteria. + + + +## Overview + +Filters refine your table views by displaying only rows that match specific conditions you define. Instead of scrolling through thousands of records, filters instantly show you relevant data based on field values, dates, text content, or numeric ranges. + +Each view maintains its own independent filter configuration, allowing you to create specialized views for different purposes. You can apply simple single-condition filters for quick searches or combine multiple conditions with AND/OR logic to create sophisticated data queries without writing code. + +> **Enterprise permissions note:** In [Enterprise plans][enterprise], users with [Editor role and lower][permissions] can create personal filters in collaborative views that only they can see. These filters don't affect other collaborators' views. + +For complex multi-condition filtering strategies, see our [advanced filtering guide][1]. + +![Multistep date filters image][2] + +## When to use filters + +**Finding specific records:** Quickly locate customers from a particular region, projects assigned to a specific team member, or invoices from last month. + +**Data analysis:** Isolate high-value transactions, identify overdue tasks, or view only incomplete items to understand trends and patterns. + +**Workflow management:** Display only rows requiring your attention, such as items awaiting approval or tasks due this week. + +**Reporting:** Create filtered views showing data subsets for specific reports, presentations, or stakeholder updates. + +**Quality control:** Identify records with missing information, duplicate entries, or values outside expected ranges. + +## Filter operators by field type + +Different field types support different filter operators. Here are the most common operators: + +| Operator category | Operators | Works with | +|-------------------|-----------|------------| +| **Text matching** | Is, Is not, Contains, Doesn't contain, Contains word, Doesn't contain word, Length is lower than, Is empty, Is not empty | Text fields | +| **Numeric comparison** | Higher than, Higher than or equal, Lower than, Lower than or equal, Is even and whole | Number fields | +| **Date filtering** | Is, Is not, Is before, Is on or before, Is after, Is on or after, Is within, Day of month is, Contains, Doesn't contain, Is empty, Is not empty | Date fields | +| **Relationship** | Has, Doesn't have, Contains, Doesn't contain, Is empty, Is not empty | Link to table fields | +| **Boolean** | Is, Is empty, Is not empty | Checkbox fields | +| **Length** | Length is lower than, Length is higher than | Text fields | +| **Select** | Contains, Doesn't contain, Contains word, Doesn't contain word, Is, Is not, Is any of, Is none of, Is empty, Is not empty, Has any of, Doesn't have any of | Single and Multiple select fields | + +## How to add a filter + +Create filters by selecting a field, choosing an operator, and defining the value to match. + +**To add a filter:** + +1. Click the **Filter** button in the view toolbar at the top-right of your table +2. Click **+ Add Filter** in the filter panel +3. Select the **field** you want to filter by from the dropdown +4. Choose a **condition operator** based on your needs (contains, equals, higher than, etc.) +5. Enter the **value** to match (specific text, number, date, or status) + +The table updates immediately to show only rows matching your filter. The filter panel shows how many rows match your criteria. + +![Adding a filter in Baserow](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/Screenshot%25202022-06-30%2520at%252013.57.13.png) + +**To remove a filter:** Click the **trash icon** next to any filter in the filter panel to delete it and restore all rows to the view. + +## How to combine multiple filters + +Apply multiple filters simultaneously using AND or OR logic to create precise data queries. + +### AND logic + +AND logic displays rows that meet **all** filter conditions simultaneously. Use AND when you need records that satisfy every requirement. + +**Example:** Show projects where Status = ""In Progress"" AND Priority = ""High"" AND Team = ""Engineering"" + +This displays only engineering projects that are both in progress and high priority, rows must match all three conditions. + +### OR logic + +OR logic displays rows that meet **any** of your filter conditions. Use OR when you need records that satisfy at least one requirement. + +**Example:** Show projects where Status = ""Blocked"" OR Status = ""At Risk"" OR Status = ""Overdue"" + +This displays projects in any of these three states, rows only need to match one condition. + +**To add multiple filter conditions:** + +1. Add your first filter as described above +2. Click **Add Filter** to add additional conditions +3. Choose **And** or **Or** logic from the dropdown between filters +4. Continue adding filters as needed + +You can mix AND and OR logic within the same view by creating filter groups. Learn more in our [advanced filtering guide][1]. + +## Filter logic comparison + +| Logic type | Behavior | Best for | Example | +|------------|----------|----------|---------| +| **AND** | All conditions must be true | Narrow, specific queries | High-priority items assigned to you that are due this week | +| **OR** | Any condition can be true | Broader searches | Items in ""Draft"" OR ""Review"" OR ""Pending"" status | + +## How to enable or disable filters + +Temporarily disable filters without deleting them to compare filtered and unfiltered views. + +**To disable all filters:** + +1. Open the filter panel +2. Click the **toggle** at the top of the filter panel +3. All filters remain configured but stop applying to the view + +**To re-enable filters:** Click the toggle again to restore all active filters. + +Disabling filters doesn't delete your filter configuration, it simply shows the unfiltered table temporarily. This is useful for verifying that your filters capture the correct data. + +> Footer aggregations (sum, average, count) automatically adjust to reflect only the visible filtered rows, helping you analyze your filtered dataset. + +## Frequently asked questions + +### Can I save different filter configurations for the same table? + +Yes, create multiple views of the same table with different filter configurations. Each view maintains its own independent filters, allowing you to quickly switch between filtered perspectives on your data. + +### Do filters affect other users viewing the same table? + +For collaborative views, yes, filter changes affect all users viewing that shared view. In [Enterprise plans][enterprise], Editor-level users can create personal filters visible only to them. To avoid affecting others, create a [personal view][3] with your own filters. + +### How many filters can I apply to a single view? + +There's no fixed limit on the number of filters per view. However, for performance and clarity, consider consolidating related conditions and keeping filter sets focused on your specific use case. + +### Can I filter by fields that are hidden in my view? + +Yes, filters work on all table fields regardless of visibility. You can filter by hidden fields, and the results will display correctly even though the filtered field doesn't appear as a column in your view. + +### Do filters work with formula fields? + +Yes, you can filter by formula field results. The filter evaluates the calculated output of the formula, not the formula itself. This allows powerful filtering based on computed values. + +### What happens to filtered-out rows? + +Filtered-out rows remain in your table; they're simply hidden from view. Removing the filter or adjusting conditions immediately restores the rows. Filters never delete data; they only control visibility. + +## Related content + +- [Advanced filtering in Baserow][1] - Create complex multi-condition filters +- [Group rows by field][4] - Organize filtered results into groups +- [Grid View guide][5] - Learn about Grid View features +- [Personal views][3] - Create private views with your own filters +- [Field configuration options][6] - Understand field types and operators +- [View customization][7] - Explore other view configuration options + +--- + + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + +[enterprise]: /user-docs/enterprise-license-overview +[permissions]: /user-docs/set-permission-level + + + [1]: /user-docs/advanced-filtering + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/563e5f98-f008-4dcc-b319-8eb7425dc3a6/Multistep%20date%20filters.jpg + [3]: /user-docs/personal-views + [4]: /user-docs/group-rows-in-baserow + [5]: /user-docs/guide-to-grid-view + [6]: /user-docs/field-customization + [7]: /user-docs/view-customization",,baserow_user_docs,https://baserow.io/user-docs/filters-in-baserow +153,Group rows by field,group-rows-in-baserow,Baserow group rows by chosen fields,"# Group rows by field values + +Grouping rows in Baserow transforms flat tables into organized hierarchies; automatically categorizing your data by status, department, priority, or any field to reveal insights hidden in long lists of records. + +This guide explains how to organize table data by grouping rows based on field values, creating collapsible sections that reveal patterns and relationships in your data. + +## Overview + +The Group by feature organizes your table rows into collapsible sections based on field values, similar to pivot tables in spreadsheets or GROUP BY clauses in databases. When you group by a field like ""Status,"" Baserow automatically creates sections for each unique status value (In Progress, Complete, Pending) and displays all matching rows within each section. + +Groups update automatically as your data changes. Add a row with a new status value, and Baserow creates a new group instantly. You can nest multiple levels of grouping to create hierarchies like Department → Team → Priority, revealing patterns across multiple dimensions simultaneously. + +Grouping works exclusively in [Grid View][1] and complements filtering and sorting to give you powerful data organization without formulas or complex configurations. + +![Grouped rows in Baserow Grid View](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/2efb8922-415e-4420-9f73-079899541fa9/Group%20by.png) + +## When to use row grouping + +**Project management:** Group tasks by Status to see what's In Progress, Blocked, or Complete. Add a second-level grouping by Assignee to see each person's status breakdown. + +**Sales pipeline:** Group opportunities by Stage (Prospecting, Negotiation, Closed) to visualize your pipeline. Nest by Sales Rep to see each team member's pipeline distribution. + +**Inventory management:** Group products by Category, then by Supplier to understand your inventory structure and supplier relationships. + +**Event planning:** Group registrations by Event Date, then by Ticket Type to see attendance patterns and revenue distribution. + +**Customer support:** Group tickets by Priority, then by Department to identify workload distribution and urgent items requiring attention. + +## Grouping vs. filtering vs. sorting + +| Feature | Purpose | Result | Rows visibility | +|---------|---------|--------|-----------------| +| **Grouping** | Organize into categories | Collapsible sections by value | All rows visible in sections | +| **[Filtering][2]** | Show subset of data | Hide rows not matching criteria | Only matching rows visible | +| **Sorting** | Change row order | Rows arranged by value | All rows visible in order | +| **Combined** | Focus and organize | Filtered data in organized groups | Only matching rows, grouped | + +## Compatible field types for grouping + +| Field type | Groups by | Example grouping | +|------------|-----------|------------------| +| **Single select** | Each option | Status: To Do, In Progress, Done | +| **Multiple select** | Each selected option (rows may appear in multiple groups) | Tags: Marketing, Sales, Product | +| **Collaborator** | Each person | Assigned to: Alice, Bob, Charlie | +| **Link to table** | Each linked record | Customer: Acme Corp, TechCo, etc. | +| **Boolean** | Checked/Unchecked | Completed: Yes, No | +| **Date, Duration, Last modified and Created on** | Date values | Due Date: 2025-01-15, 2025-01-20, etc. | +| **Text, URL and Email** | Exact text matches | Department: Engineering, Sales, Support | +| **Number, Count, Phone number and Rating** | Exact number values | Priority: 1, 2, 3 | + +**Note:** Formula fields, lookup fields, and other computed fields can be used for grouping based on their result type. + +## How to add a group + +Create your first group level to organize rows by a single field. + +**To group rows:** + +1. Open your table in [Grid View][3] +2. Click the **Group** button in the view toolbar +3. Select **Choose a field to group by** from the dropdown +4. Choose the field you want to group by + +Rows immediately reorganize into collapsible sections based on the field's unique values. Each section header shows the value name and row count. + +## How to add multiple group levels + +Create nested groups (subgroups) to reveal hierarchical patterns in your data. + +**To add a second group level:** + +1. After creating your first group, click **Choose a field to group by** again +2. Select a second field from the dropdown +3. Rows within each first-level group are now divided into second-level subgroups + +**Example:** Group by Department (first level), then by Priority (second level) to see each department's priority breakdown. + +**To add more levels:** Repeat the process to create third, fourth, or more nesting levels. Each level creates subgroups within the previous level's sections. + +**Group order matters:** The first field creates top-level sections, the second creates subgroups within those sections, and so on. Reorder group levels by dragging them in the Group panel. + +## How to manage groups + +### Remove a group level + +Click the **X** button next to any group in the Group panel to remove that grouping level. Removing a middle level shifts the lower levels up in the hierarchy. + +### Change a group field + +Click a group field in the Group panel and select a different field from the dropdown to replace it. The view instantly regroups using the new field. + +> The top field always creates the primary grouping, with subsequent fields creating nested subgroups. + +### Clear all groups + +Remove all group levels by clicking the X button on each group, or close the Group panel and click ""Clear all"" if available. Your table returns to a flat list view. + +## Group summaries and counts + +Each group header displays a summary showing how many rows belong to that group. These counts update automatically as you add, edit, or delete rows. + +When using [footer aggregations][3] (sum, average, count), the aggregated values reflect only the visible filtered rows, even within groups. This lets you analyze grouped subsets of your data with calculated totals. + +![Group summaries showing row counts](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/9e8b91d4-32e5-469d-afb1-09b98242df96/Grouped%20records%20and%20the%20summary%20bar.png) + +## Combining grouping with filters and sorts + +Grouping works alongside filtering and sorting to create powerful data views: + +**Grouping + Filtering:** Apply [filters][4] first to show a subset of rows, then group the filtered results. Example: Filter to show only ""Open"" tickets, then group by Priority. + +**Grouping + Sorting:** [Sort][1] rows within each group alphabetically, numerically, or by date. Groups maintain their structure while rows inside sort independently. + +**Grouping + Both:** Create focused, organized views by filtering unwanted rows, grouping the results into categories, and sorting within each group. Example: Show this quarter's sales (filter) → grouped by Region → sorted by Deal Value descending. + +## How grouping affects multiple select fields + +Multiple select fields behave differently when used for grouping because rows can have multiple values selected. + +When you group by a multiple select field, rows appear in **every group** corresponding to their selected values. A task tagged with both ""Marketing"" and ""Sales"" appears in both the Marketing group and the Sales group. + +This differs from single select grouping, where each row appears in exactly one group. Be aware that group row counts may exceed your total row count when grouping by multiple select fields. + +## Frequently asked questions + +### Can I group by formula fields or lookup fields? + +Yes, you can group by any field type, including formulas and lookups, as long as the field produces a groupable value. The grouping uses the calculated or looked-up result values to create groups. + +### What happens to rows with empty values when grouping? + +Rows with empty values in the grouped field appear in a separate ""(Empty)"" group at the top or bottom of your view. This makes it easy to identify records with missing values in important fields. + +### Do groups affect my data or just the view? + +Grouping only affects how you view data; it never changes your underlying data. Remove all groups and your original table structure remains intact. Each view can have different grouping configurations. + +### Does grouping slow down my table? + +Grouping adds minimal performance impact for most tables. Very large tables (100,000+ rows) with multiple group levels may take slightly longer to render, but Baserow's lazy loading ensures smooth scrolling and interaction. + +### Can I export grouped data with its group structure? + +When you export a view, the data exports in flat format without group structure. However, rows appear in the order they're displayed in groups, so you can see the grouping sequence in your exported file. + +## Related content + +- [Grid View guide][1] - Learn about Grid View features and capabilities +- [Filter rows][4] - Combine filtering with grouping for focused views +- [View customization][5] - Explore other view configuration options +- [Field summaries][3] - Add calculations to grouped data +- [Create custom views][6] - Design views optimized for specific grouping needs +- [Rows overview][7] - Understand how rows work in Baserow + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: /user-docs/guide-to-grid-view + [2]: https://baserow.io/user-docs/filters-in-baserow + [3]: /user-docs/footer-aggregation + [4]: /user-docs/filters-in-baserow + [5]: /user-docs/view-customization + [6]: /user-docs/create-custom-views-of-your-data + [7]: /user-docs/overview-of-rows",,baserow_user_docs,https://baserow.io/user-docs/group-rows-in-baserow +154,Created by field,created-by-field,Created by field in Baserow,"# Working with the 'Created by' field + +The **'Created by' field** automatically stamps a row with the user who created it, providing a permanent, unchangeable record of origin. + +This guide covers what the 'Created by' field is and its key properties, how to add this automatic field to your table, and how it differs from 'Last modified by' and 'Collaborator' fields. + + +Learn more: [Configure field types](https://baserow.io/user-docs/field-customization) + + + +![Created by field in Baserow][3] + +## What is the 'Created by' field? + +The 'Created by' field automatically tracks and displays the name of the workspace [collaborator who created each row][2] within a table. + +When a [new row is created][1], Baserow populates this field with the active user's name. A key feature is that this field is **non-editable** and **permanent**. The information remains unchanged even if the row is edited or modified by other users, ensuring data integrity. + +This provides clear accountability, helping you trace information back to its source for historical reference or follow-up. + + + + +## How to add the 'Created by' field + +While the field's data is captured automatically, you must add the column to your table to see it. + +1. In your table, click the plus sign `+` to [add a new field](/user-docs/adding-a-field). +2. Search for and select **Created by** from the field type dropdown. +3. Click **Create**. + +Once added, the field will automatically populate for any [new rows created][1]. + +> **Note:** This field only tracks the *original creator*. To see who last *edited* a row, consider using the [Last modified by field][4]. + + + +## Frequently asked questions + +### What's the difference between 'Created by' and 'Last modified by'? +The 'Created by' field shows who *created* the row and never changes. The [Last modified by field][4] shows the user who *last edited* the row and updates with every change. + +### What's the difference between 'Created by' and a 'Collaborator' field? +'Created by' is **automatic** and set by the system. A [Collaborator field][8] is **manual**; it's a field where you actively *assign* one or more users to a row (like for a task). + +### Can I change the user in the 'Created by' field? +No. The 'Created by' field is **non-editable** to ensure it remains a reliable source of truth for who created the record. + +### Can I use this field in formulas? +Yes. The 'Created by' field can be referenced in formulas, allowing you to trigger actions or display different information based on the row's creator. + + + +## Related content +* [Last modified by field][4] +* [Add workspace collaborators][8] +* [Field overview][5] +* [Manage workspace members][9] + +--- + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account. + + [1]: /user-docs/how-to-make-new-rows + [2]: /user-docs/managing-workspace-collaborators + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/95398426-eb1f-480c-b9ff-6d0ec3165106/Created%20by.png + [4]: /user-docs/last-modified-by-field + [5]: /user-docs/baserow-field-overview + [6]: /user-docs/adding-a-field + [7]: /user-docs/field-customization + [8]: /user-docs/working-with-collaborators + [9]: /user-docs/manage-workspace-permissions",,baserow_user_docs,https://baserow.io/user-docs/created-by-field +155,Last modified by field,last-modified-by-field,Last modified by field in Baserow,"# Working with the 'Last modified by' field + + + +The **'Last modified by' field** automatically stamps a row with the user who made the most recent change, providing a clear audit trail. + +This guide covers what the 'Last modified by' field is and its key properties, how to add this automatic field to your table, how it differs from 'Last modified' (time), 'Created by', and 'Collaborator' fields, and what user actions trigger an update. + +Learn more: [Configure field types](https://baserow.io/user-docs/field-customization) + +![Last modified by field in Baserow][2] + +## What is the 'Last modified by' field? + +The 'Last modified by' field automatically tracks and displays the name of the [workspace user][1] who last edited a row. + +It is a **non-editable** field, meaning you cannot manually change the user. This ensures data integrity and provides clear accountability, helping you trace changes back to a specific individual. + +This field is the direct companion to the **'[Last modified' (time) field][53]**. Together, they show you *who* made the last change and *when* it happened. + + + +## How to add the 'Last modified by' field + +While Baserow tracks this information automatically, you must add the field to your table to see it. + +1. Open your Baserow database and the desired table. +2. Click the `+` button to add a [new field][5]. +3. Search for and select **Last modified by** from the field type dropdown. +4. Click **Create**. + +Once added, the field will automatically populate with the name of the user who makes the next modification to any row. + + + +## FAQs + +### What's the difference between 'Last modified by' and 'Last modified' (time)? +They are companion fields designed to be used together. 'Last modified by' (this field) shows *who* made the edit. '[Last modified' field][53] shows *when* the edit happened (the date and time). + +### What's the difference between 'Last modified by' and 'Created by'? +They track two different user actions. '[Created by' field][3] shows who *created* the row. It is set *once* and *never* changes. 'Last modified by' shows who *last edited* the row. It updates with *every* change. + +### What's the difference between 'Last modified by' and a 'Collaborator' field? +'Last modified by' is **automatic** and non-editable. The system sets this value based on a user's action. +'[Collaborator' field][49] is **manual**. It's a field where you actively *assign* one or more users to a row (like for a task). + +### What actions trigger an update? +The 'Last modified by' field updates only when a user makes a *direct edit* to a cell's value. This does not include automatic updates from computed fields (like [Formulas][61], [Lookups][48], or [Rollups][51]). For [Link to table fields][47], it *will* update if a user adds or removes a link, but it *will not* update if the data *inside* the linked record changes in its own table. + + + +## Related content +* [Last modified field][53] +* [Created by field][3] +* [Collaborator field][49] +* [Field overview][4] + +--- + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account. + + [1]: /user-docs/managing-workspace-collaborators + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/c5ff2083-6b1a-45ac-8d8f-df2b1bff3ec6/Last%20modified%20by.png + [3]: /user-docs/created-by-field + [4]: /user-docs/baserow-field-overview + [5]: /user-docs/adding-a-field + [47]: /user-docs/link-to-table-field + [48]: /user-docs/lookup-field + [49]: /user-docs/collaborator-field + [51]: /user-docs/rollup-field + [53]: /user-docs/last-modified-field + [61]: /user-docs/understanding-formulas",,baserow_user_docs,https://baserow.io/user-docs/last-modified-by-field +156,Duration field,duration-field,Duration field in Baserow,"# Working with the Duration field + + + +The **Duration field** is a specialized field for tracking time in hours, minutes, seconds, or days, making it perfect for logging work, tasks, or event lengths. + +This guide covers what a Duration field is and its common uses, how to add the field and enter data, the different duration formats (e.g., h:mm:ss, d h m s), and how to use Duration fields in formulas. + +Learn more: [Configure field types](https://baserow.io/user-docs/field-customization) + +![Add a Duration field in Baserow][1] + +## What is a Duration field? + +A Duration field is designed to store a length of time, such as 2 hours and 30 minutes, 45 seconds, or 3 days. + +Unlike a [Number field][36], it understands time-based units, allowing you to format the display and perform time-based calculations. This is ideal for tracking task or project durations, call or meeting lengths, event or video lengths, or time logs. + +The Duration field also supports negative values, which can be useful for time-based adjustments or countdowns. + +## How to add a Duration field + +1. In your table, click the plus sign `+` to [add a new field](/user-docs/adding-a-field). +2. Select **Duration** from the field type dropdown menu. +3. Name your field (e.g., ""Task Length""). +4. Click **Create**. + +## How to enter data + +You can enter durations in a cell using several formats: +* **Smart entry:** Type the time using abbreviations (e.g., `1h 30m`, `3d 45s`, `1:23:45`). +* **In seconds:** Enter a plain number (e.g., `90`). The field will interpret this as seconds and then auto-format it based on your settings (e.g., `1:30`). + +To enter a negative duration, simply add a minus sign (`-`) before the value (e.g., `-1h 30m`). + +## Duration formats + +You can customize how the duration is displayed from the [field configuration menu][27]. This is useful for standardizing your data's appearance without changing the underlying value. + +| Format | Example | Description | +| --- | --- | --- | +| `h:mm` | 1:23 | Hours and minutes | +| `h:mm:ss` | 1:23:40 | Hours, minutes, and seconds | +| `h:mm:ss.s` | 1:23:40.0 | ...and deciseconds | +| `h:mm:ss.ss` | 1:23:40.00 | ...and centiseconds | +| `h:mm:ss.sss` | 1:23:40.000 | ...and milliseconds | +| `d h` | 1d 2h | Days and hours | +| `d h:mm` | 1d 2:34 | Days, hours, and minutes | +| `d h:mm:ss` | 1d 2:34:56 | Days, hours, minutes, and seconds | +| `d h m` | 1d 2h 3m | Days, hours, and minutes (abbreviated) | +| `d h m s` | 1d 2h 3m 4s | Days, hours, minutes, and seconds (abbreviated) | + +## Using Duration fields in formulas + +Duration fields work seamlessly with [formulas][60] for calculations. + +* **Math Operations:** You can use multiplication (`*`) and division (`/`) to scale durations (e.g., `field('Task Length') * 3`). +* **Date Calculations:** You can find the time between two dates. A formula like `today() - field('Start Date')` will result in a duration, which you can then format as days. +* **Converting to a number:** Use the `tonumber()` function to convert a duration into its total number of **seconds**. This is essential for more complex calculations, like calculating an hourly rate: + * `field('Project Fee') / (tonumber(field('Time Logged')) / 3600)` + + + +## Frequently asked questions + + +### What's the difference between a Duration field and a Number field? +A [Number field][36] stores a plain number (e.g., ""1.5""). A Duration field understands time units and stores ""1 hour 30 minutes."" Use a Duration field when you need to log time and display it in a human-readable format (h:mm:ss) rather than as a decimal. + +### How do I sum a column of Duration fields? +To sum a total duration for linked records, you can use a [Rollup field][51]. In the rollup configuration, select your Duration field and use the `sum` function. + +### How do I enter negative durations? +Simply type a minus sign (`-`) before your entry, just as you would with a Number field (e.g., `-1h 30m` or `-90`). + + + +## Related content +* [Number field][36] +* [Date and time fields][39] +* [Formula field reference][61] +* [Rollup field][51] +* [Field configuration options][27] + +--- + + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account. + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/8f77d58d-a36d-4475-86bf-edcde4a2c90d/Duration.png + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/8497a4a9-879f-4fa3-9233-2bee6c7cce13/Untitled.png + [27]: /user-docs/field-customization + [36]: /user-docs/number-field + [39]: /user-docs/date-and-time-fields + [51]: /user-docs/rollup-field + [60]: /user-docs/formula-field-overview + [61]: /user-docs/understanding-formulas",,baserow_user_docs,https://baserow.io/user-docs/duration-field +157,Autonumber field,autonumber-field,Autonumber field in Baserow,"# Working with the Autonumber field + +The **Autonumber field** automatically adds a unique, sequential number to every row, making it easy to create simple, human-readable IDs. + +This guide covers what an Autonumber field is and its key properties, how to add an Autonumber field to your table, why gaps appear in the sequence, and how to re-number the field to create a clean sequence. + +Learn more: [Configure field types](https://baserow.io/user-docs/field-customization) + +![Autonumber field in Baserow][1] + +## What is an Autonumber field? + +An Autonumber field automatically assigns a unique, incrementing number (1, 2, 3...) to each new row. The number is assigned based on the row's [creation date and time][2] and will not change, even if you re-order your rows. + +A key feature of this field is that it is **non-editable**. You cannot manually change the numbers, which ensures data integrity. It's often used as a simple [primary key][3] or an easy way to reference records (e.g., ""Ticket #""). + +## How to add an Autonumber field + +1. In your table, click the plus sign `+` to [add a new field](/user-docs/adding-a-field). +2. Select **Autonumber** from the field type dropdown menu. +3. Name the field (e.g., ""Row ID""). +4. Click **Create**. + +The field will automatically populate for all existing rows and any new rows you create. + +## How to re-number rows + +Autonumbering always begins at 1. If you delete rows, this will create gaps in the sequence (e.g., 1, 2, 4, 5). Baserow **does not** automatically refill these gaps, as the numbers are meant to be stable identifiers. + +If you need a clean, sequential list again (1, 2, 3...), you have two options: + +1. **Re-create the field:** [Delete the Autonumber field][4] entirely. When you add a new Autonumber field, it will generate a fresh, clean sequence for all rows based on their current creation time. +2. **Convert the field type:** Change the Autonumber field to a [Single line text field][5] (or another type). This ""breaks"" the autonumbering. Then, convert the field *back* to an Autonumber field to trigger a re-numbering of all rows. + + + +## Frequently asked questions + +### What's the difference between an Autonumber and a UUID field? +They both create unique IDs, but serve different purposes. Autonumber is a simple, *human-readable*, incrementing number (1, 2, 3...). It is unique *within that table*. + +[UUID field][6] is a 36-character, complex string (e.g., `a1b2c3d4-...`). It is *globally unique*, meaning it won't conflict with records in any other database. Use Autonumber for simple internal references. **Use UUID** when you need a universally unique ID, especially for use with external systems or APIs. + +### Can I change the starting number? +No. The Autonumber field always starts at 1. + +### Why are there gaps in my numbers? +This is by design. Gaps are created when you delete rows. The field does not reuse numbers from deleted rows to ensure that a row's ID, once assigned, never changes or gets re-assigned to a new record. + +## Related content +* [UUID field][6] +* [Primary field][3] +* [Created on field][7] +* [Field overview][8] + +--- + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account. + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/f71bc95d-9ce9-49fa-8a6c-92d023d1968b/Autonumber.png + [2]: /user-docs/date-and-time-fields + [3]: /user-docs/primary-field + [4]: https://baserow.io/user-docs/field-customization + [5]: /user-docs/single-line-text-field + [6]: /user-docs/uuid-field + [7]: /user-docs/date-and-time-fields + [8]: /user-docs/baserow-field-overview",,baserow_user_docs,https://baserow.io/user-docs/autonumber-field +158,UUID field,uuid-field,UUID field in Baserow table,"# Working with the UUID field + +The **UUID field** automatically generates a globally unique 36-character ID for every row, perfect for use with external systems and APIs. + +This guide covers what a UUID field is and why it's used, how to add a UUID field to your table, and the key differences between a UUID and an Autonumber field. + +Learn more: [Configure field types](https://baserow.io/user-docs/field-customization) + +![UUID field][1] + + +## What is a UUID field? + +A UUID (Universally Unique Identifier) field is an automatic field that generates a unique 36-character string (e.g., `a1b2c3d4-e5f6-7890-g1h2-i3j4k5l6m7n8`) for every new row. + +The two key properties of this field are: +* **Non-editable:** Users cannot manually change the value, ensuring data integrity. +* **Globally unique:** The generated ID is statistically guaranteed to be unique across all tables and all databases, not just within its own table. + +This makes it the perfect choice for a [primary field][33] when you need a stable, unique ID for use with APIs, external integrations, or when merging data from different sources. + + + +## How to add a UUID field + +1. In your table, click the plus sign `+` to [add a new field](/user-docs/adding-a-field). +2. Select **UUID** from the field type dropdown menu. +3. Name the field (e.g., ""Unique ID""). +4. Click **Create**. + +The field will automatically populate for all existing rows and any new rows you create. + + + +## Frequently asked questions + +### What's the difference between a UUID and an Autonumber field? +While both fields create unique IDs, they serve different purposes: +* **[Autonumber field][56]:** Creates a simple, *human-readable*, incrementing number (1, 2, 3...). It is only unique *within its own table*. Use it for simple internal references. +* **UUID field:** Creates a complex, 36-character *machine-readable* string. It is *globally unique*. Use it when you need a permanent ID for external systems, APIs, or merging databases. + +### Can I edit a UUID value? +No. The field is non-editable to guarantee its uniqueness and integrity as a permanent record identifier. + +### Can I use a UUID as a primary field? +Yes. It is an excellent choice for a [primary field][33], especially if you plan to access your data via the API or from other applications. + + +## Related content +* [Autonumber field][56] +* [Primary field][33] +* [Field overview][25] + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account. + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/0208b9af-752b-4cd2-990f-543541f6003b/UUID.png + [2]: /user-docs/baserow-field-overview + [3]: /user-docs/adding-a-field + [4]: /user-docs/field-customization + [5]: /user-docs/overview-of-rows + [6]: /user-docs/overview-of-rows + + [1]: https://baserow-backend-production2024082211234988452400000001.s3.amazonaws.com/pagedown-uploads/0208b9af-752b-4cd2-990f-543541f6003b/UUID.png + [25]: /user-docs/baserow-field-overview + [33]: /user-docs/primary-field + [56]: /user-docs/autonumber-field",,baserow_user_docs,https://baserow.io/user-docs/uuid-field +159,Form survey mode,form-survey-mode,Baserow form: Form survey mode,"# Form survey mode + +Survey mode displays form questions one at a time instead of showing all fields on a single page, creating a more focused data collection experience. + +This guide covers when and how to use survey mode for single-question forms that improve completion rates and user engagement. + +> **Paid feature:** Survey mode is available on [paid plans](/user-docs/pricing-plans). Users on the free plan can create forms, but only in [standard mode][1]. + +## What is survey mode? + +Survey mode transforms multi-field forms into step-by-step question flows. Instead of overwhelming respondents with all questions at once, the survey mode presents one question per screen with navigation controls to move forward and backwards. + +Survey mode is a display option for [Form views](/user-docs/guide-to-creating-forms-in-baserow), not a separate view type. Switch between [standard form][1] mode and survey mode anytime without affecting your form configuration or collected data. + +![Form survey mode showing one question at a time](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/8f3b49d1-cf5e-445b-8457-3bba35418af1/Screenshot%25202022-09-08%2520at%252016.10.00.png) + +## Survey mode vs standard form mode + +Understanding the differences helps you choose the right display option for your forms. + +| Aspect | Survey mode | Standard form mode | +|--------|-------------|-------------------| +| **Question display** | One at a time | All questions visible | +| **Navigation** | Previous/Next buttons | Scroll up/down | +| **Best for** | 10+ questions, focused responses | Quick forms, 1-9 questions | +| **Completion rates** | Often higher (less overwhelming) | Lower for long forms | +| **Mobile experience** | Excellent (fits any screen) | Can require scrolling | +| **When users quit** | Clear where they stopped | May abandon mid-scroll | +| **Premium feature** | Yes | No (available on all plans) | + +## Switch between modes + +Change form display mode at any time without affecting form configuration or existing submissions. + +1. Open your Form view in edit mode +2. Click **Change mode** in the toolbar at the top +3. Select **Survey mode** or **Form mode** +4. The form updates immediately + +**What stays the same:** +- Field configuration (labels, descriptions, required status) +- Form conditions and logic +- Branding (logo, cover image) +- Post-submission behavior +- All existing form submissions + +**What changes:** +- How questions display to respondents (one vs all) +- Navigation method (buttons vs scrolling) + +## Configure survey mode + +Survey mode uses the same field configuration as [standard form mode][1] but presents fields differently. Understanding how respondents experience survey mode helps you design better forms. + +### Reorder questions + +In survey mode, question order determines the step-by-step flow. + +1. Click **Order fields** at the bottom of the survey mode editor +2. A pop-up displays all form fields +3. **Drag fields** using the handle (⋮⋮) to reorder them +4. Close the pop-up to save changes + +![Reordering fields in survey mode](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/9176b5b4-fb11-4d46-a22a-7e279b6be296/fd2fc9d863fc0204cf5c8121256ad168f40cac9d.webp) + +Question order is critical in survey mode since respondents see questions sequentially. Put logical progression questions early, sensitive questions later, after engagement is established. + +### Navigate between questions + +While editing in survey mode, **arrow buttons** at the bottom right let you advance or return to previous questions if respondents want to review or change answers. Click through questions to verify order and appearance to test how respondents will experience the flow. + + - **Next button:** Advances to the next question after the respondent completes the current question + - **Submit button:** Appears on the final question instead of ""Next"" + +### Configure individual fields + +All [standard Form][1] field configuration applies to survey mode, including field labels and descriptions, required field toggles, [conditional logic](/user-docs/guide-to-creating-forms-in-baserow#form-conditions-conditional-logic), and field-specific options (radio buttons, checkboxes, etc.) + +Required fields and validation errors display immediately when respondents try to advance. They cannot proceed to the next question until the current question is properly completed. + +Refer to the [Form view guide](/user-docs/guide-to-creating-forms-in-baserow#configure-form-fields) for complete field configuration details. + +## When to use survey mode + +**Long forms (10+ questions):** Survey mode prevents overwhelming respondents with lengthy forms. Breaking questions into steps improves completion rates significantly. + +**Customer satisfaction surveys:** Multi-part surveys benefit from focused attention on each question. Respondents give more thoughtful answers when not distracted by upcoming questions. + +**Personality assessments or quizzes:** Step-by-step progression creates a better experience for forms where question order matters or builds on previous answers. + +**Mobile-first forms:** Survey mode automatically optimizes for small screens. One question per screen eliminates scrolling and zooming issues on mobile devices. + +**Progressive profiling:** Collect detailed information gradually. Survey mode makes multi-step data collection feel less burdensome than long scrolling forms. + +**Conditional branching forms:** When using [form conditions](/user-docs/guide-to-creating-forms-in-baserow#form-conditions-conditional-logic), survey mode's step-by-step flow makes conditional logic clearer to respondents. + +## When to use standard form mode + +**Short forms (1-9 questions):** All questions visible at once is more efficient for quick submissions like contact forms or simple registrations. + +**Forms requiring field comparison:** When respondents need to see multiple questions together (e.g., date range pickers, start/end times), standard mode works better. + +**Data entry by trained users:** Internal users entering data repeatedly prefer seeing all fields without navigation clicks. + +**Forms with optional questions:** When many fields are optional, users want to see everything to decide what to answer rather than clicking through many ""skip"" screens. + + +## Frequently asked questions + +### Can I switch between modes after collecting submissions? + +Yes. Changing display mode doesn't affect existing submissions or form configuration. You can switch modes freely based on performance or respondent feedback. + +### Do I need to reconfigure fields when switching modes? + +No. Field configuration (labels, descriptions, required status, conditions) remains identical. Only the presentation changes; one question at a time vs all questions visible. + +### Does survey mode work with conditional logic? + +Yes. [Form conditions](/user-docs/guide-to-creating-forms-in-baserow#form-conditions-conditional-logic) work in both modes. Survey mode can actually make conditional logic clearer since fields appear or don't appear as respondents progress, rather than hiding/showing on a scrolling page. + +### Can respondents go back to previous questions? + +Yes. The ""Back"" arrow lets respondents review and change previous answers before final submission. Configure post-submission behavior separately; that determines what happens after clicking ""Submit."" + +### Does survey mode affect form completion rates? + +Generally, yes, positively. Research shows one-question-at-a-time formats often have higher completion rates than long scrolling forms, especially for 10+ question forms. However, test with your specific audience and form length. + +### Does survey mode support all field types? + +Survey mode supports the same field types as [standard form][1] mode. Some field types (Formula, Created on, Count, UUID, Rollup, Last modified, Lookup) aren't compatible with forms at all since they calculate automatically. + +## Related resources + +### Form features +- [Form view guide](/user-docs/guide-to-creating-forms-in-baserow) - Complete form documentation +- [Form conditions](/user-docs/guide-to-creating-forms-in-baserow#form-conditions-conditional-logic) - Conditional logic +- [Pre-fill forms](/user-docs/guide-to-creating-forms-in-baserow#pre-fill-form-fields) - URL parameters +- [Public sharing](/user-docs/public-sharing) - Share forms externally + +### View basics +- [Views overview](/user-docs/overview-of-baserow-views) - Understanding all view types +- [View configuration options](/user-docs/view-customization) - General view settings + +### Plans and features +- [Pricing plans](https://baserow.io/pricing) - Feature availability by plan + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow.io/user-docs/guide-to-creating-forms-in-baserow",,baserow_user_docs,https://baserow.io/user-docs/form-survey-mode +160,Last modified field,last-modified-field,Last modified field in Baserow,"# Working with the 'Last modified' field + +The **'Last modified' field** automatically stamps a row with the exact date and time of its most recent user-made change, helping you track updates. + +This guide covers what the 'Last modified' field is and its key properties, how to add this field to your table, and how to limit tracking to specific fields. + +Learn more: [Configure field types](https://baserow.io/user-docs/field-customization) + +![Last modified field in Baserow][1] + + +## What is the 'Last modified' field? + +The 'Last modified' field is an automatic, read-only field that shows the date and time a row was last edited by a user. + +When a [new row is created][2], its 'Last modified' value will be the same as its '[Created on][3]' time. This timestamp will update every time a user edits any editable field in that row. + +> A key behavior to note is that a row's 'Last modified' value never rolls back. If you edit a cell and then use ""Undo,"" the 'Last modified' time will reflect the time of the ""Undo"" action, not the time before the edit. + +## How to add a 'Last modified' field + +### Add the field + +1. In your table, [add a new field](/user-docs/adding-a-field). +2. Select **Last modified** from the field type dropdown. +3. Name the field (e.g., ""Last Update""). +4. Click **Create**. + +By default, this field will track changes made to *any* editable field in the row. + +You can choose to restrict the field so that it only displays the most recent time a particular field was modified. + +## Track the last modified time on computed fields + +The [date functions in formulas][11] can be used to return the date and time of the most recent user modification. Using the date functions in formulas, you can specify one or more field names to track modification and return the date and time of the most recent change made to any of the specified fields. + +Both the formula function and the Last modified field type reflect recent changes to editable fields by a user. They do not capture changes made automatically in any fields, such as formula fields, where the user does not directly modify the cell values but rather uses Baserow to compute the values. + +If you add or remove a row from a [Link-to-table field][9], the Last modified data will change. However, if the data linked to the [Link-to-table field][9] field changes, the latest modified time will not change. Although the connected row's values in the other table have changed, you haven't altered which row you are linking to. Changing the [Link-to-table field][9] row's fields that are stored in a different table won't affect the Last modified value. + + + +## Frequently asked questions + +### What's the difference between 'Last modified' and 'Last modified by'? +They work together: +* **'Last modified'** (this field) tells you *when* the last edit happened (the date and time). +* **'[Last modified by][5]'** tells you *who* made the last edit (the user). + +### What's the difference between 'Last modified' and 'Created on'? +* **'[Created on][3]'** is set *once* when the row is created and *never* changes. +* **'Last modified'** updates *every time* the row is edited. + +### Do formula fields or other computed fields trigger an update? +No. The 'Last modified' field tracks changes made directly *by a user*. It does not track automatic changes in computed fields (like [Formulas][6], [Lookups][7], or [Rollups][8]) that update because their underlying data changed. + +### Does a 'Link to table' field trigger an update? +This is a special case: +* **YES:** If you *add or remove a link* from the [link to table field][9], this is a user edit and **will** trigger an update. +* **NO:** If the data *inside* the linked row changes (e.g., the linked record's name is edited in its own table), this does *not* count as an edit to the current row, and **will not** trigger an update. + + + +## Related content +* [Last modified by field][5] +* [Created on field][3] +* [Working with timezones][10] +* [Link-to-table field][9] + +--- + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account. + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/2ea570e8-4d07-4f23-a698-f05a5032bc1b/Last%20modified%20field%20in%20Baserow.jpg + [2]: /user-docs/how-to-make-new-rows + [3]: /user-docs/date-and-time-fields#created-on + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/4cef1844-f11c-456c-a062-27732e4fbf52/Screenshot_2022-07-14_at_07.44.47.png + [5]: /user-docs/last-modified-by-field + [6]: /user-docs/understanding-formulas + [7]: /user-docs/lookup-field + [8]: /user-docs/rollup-field + [9]: /user-docs/link-to-table-field + [10]: /user-docs/working-with-timezones + [11]: /user-docs/understanding-formulas",,baserow_user_docs,https://baserow.io/user-docs/last-modified-field +161,Password field,password-field,Password field in Baserow table,"# Working with the Password field + +The **Password field** securely hashes and stores user passwords. The Password field can also be used for authentication in the Baserow [Application Builder][1]. + +This guide covers what a Password field is and its primary use case, the key security features (write-only and hashed), and how to add a Password field to your table. + +Learn more: [Configure field types](https://baserow.io/user-docs/field-customization) + +![Password field type in Baserow][2] + + + +## What is a Password field? + +The Password field is a highly specialized, secure field for storing passwords. + +This field is *not* for storing your team's website passwords like a password manager, because it is **write-only**. Its main purpose is to create user tables to power the [login element][3] in the [Baserow Application Builder][4]. + +It has two key security features: + +1. **Write-only functionality:** When you type into a Password field, the value is masked. Once you click away, the value is **never shown again**. You cannot view, copy, or retrieve the password; only overwrite it. +2. **Hashed storage:** The password is not stored as plain text. It is stored as a secure ""hash"" (a long, scrambled string). This means that even in the event of a data breach, the original passwords cannot be read. They can only be *checked* for a match during a login attempt. + +## How to add a Password field + +1. In your table, click the plus sign `+` to [add a new field](/user-docs/adding-a-field). +2. Select **Password** from the field type dropdown menu. +3. Name the field (e.g., ""User Password""). +4. Click **Create**. + +This will create a new, write-only field in your table. + +## Allow API endpoint authentication + +This option exposes an endpoint where the row ID and password can be checked to see if they're correct. This allows using Baserow as an authentication backend. + +This field is the foundation for building secure user authentication (like a ""users"" table) for your own custom applications. + +Learn more: [Open API documentation][5] + +## Frequently asked questions + +### What is the main purpose of this field? +You use the Password field to create a ""Users"" table in the [Baserow Application Builder][4], which the [Login element][3] can then check against to authenticate users for your custom application. + +### Can I see or recover the password after I enter it? +No. For security, this field is **write-only**. Once you have entered a password and saved the row (by clicking off the cell), you can *never* see it again. You can only enter a new password to overwrite the old one. + +### What's the difference between a Password field and a text field? +A [Single Line Text field][6] stores data as plain text, which is *visible to anyone* who can see the field. The Password field *hides and hashes* the data so it can never be read, only checked for a match. + +### Can I use this field to store my team's website logins? +**This is not recommended.** Because the field is write-only, you would not be able to retrieve the passwords you save. For that use case, a [Single Line Text field][6] would be functional, but be aware that it is not encrypted and will be visible in the table. + + + +## Related content +* [Application Builder overview][4] +* [Application Builder Login element][3] +* [User sources][7] +* [Field overview][8] + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we’re ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io/) +- [Contact support](/contact) for questions about Baserow or help with your account. + + + [1]: https://baserow.io/user-docs/application-builder-overview + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/9597b3d5-a8c6-48c7-bfbe-16aa0513487d/Untitled.png + [3]: /user-docs/application-builder-login-element + [4]: /user-docs/application-builder-overview + [5]: https://baserow.io/api-docs + [6]: /user-docs/single-line-text-field + [7]: /user-docs/user-sources + [8]: /user-docs/baserow-field-overview",,baserow_user_docs,https://baserow.io/user-docs/password-field +162,Application Builder overview,application-builder-overview,Baserow Application Builder features,"# Baserow Application Builder overview + +Baserow’s Application Builder module is a powerful way to build applications, offering flexible ways to create workflows, visualize data, and tailor information to different audiences across organizations. + +In this section, we'll cover the basics of the Application Builder in Baserow. You’ll learn foundational knowledge about creating customized applications that fit your needs. + + + +## Core concepts + +The Application Builder allows you to create custom software applications for various purposes, such as building websites, client portals, internal tools, dashboards, and more. + +Baserow Application Builder is based on these core concepts: + +### [Pages][2] + +Think of pages like tables in a database. An application can have one or many pages. Every page has its own name, path, and specific path parameters. You can make new pages and view all your app's pages on Baserow's left sidebar. + +### [Elements][3] + +Elements are the core components of pages that shape how your applications look and how users can interact with them. These include elements like titles, text, or images. You stack them on a page to build it. When you click an element in the page editor, the right sidebar shows options for that element so you can change how it looks and works. + +### [Data sources][4] + +The data sources allow your pages to connect to data in a Baserow table. You can pick a table and view to connect. You can also set filters for those views. + +### [Events and actions][5] + +Elements like buttons or forms can cause things to happen in apps when people use them. Say someone fills out a form or clicks a button. You can decide what should happen next. Maybe you want to add a new row to a Baserow table, open up a different page, or take the user to a website. + +### [Domains][6] + +Before publishing your app, add a domain. Use a subdomain or a custom domain name. Once added, hit **Publish** to go live. + +![Baserow Application Builder ][1] + + +## Navigating the Application Builder + +Understanding the basics of the Application Builder helps you sort, see, and use your data better. This makes your work easier and more intuitive. + +To start, head to the dashboard and pick the application you want to work on or hit the **+Create new** button. Then choose the **Application** option. You can tweak its settings with no trouble. For more help on making a new application, [check out this support section][7]. + +On the sidebar, there's a list of your application's pages. Click one to open it. + +At the top left of the page, you'll find three options: [Elements][3], [Data][4], and [Page settings][2]. These let you control what's on the page. + +In the middle of the top bar, switch between web, tablet, and mobile views. This shows how your page will look on different screens. + +Finally, at the top right, the **Preview** and **Publish** buttons are there for you. The **Preview** button lets you see how your application looks at any time, and the **Publish** button helps you make your changes live in production. + +![Navigating the Application Builder][8] + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/9603b529-afd3-4232-ba94-21e4bd969879/Untitled.png + [2]: /user-docs/pages-in-the-application-builder + [3]: /user-docs/elements-overview + [4]: /user-docs/data-sources + [5]: /user-docs/element-events + [6]: /user-docs/add-a-domain-to-an-application + [7]: /user-docs/create-an-application + [8]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/dc58410f-3ff7-41ac-89f7-1551d27c7943/Untitled%201.png",,baserow_user_docs,https://baserow.io/user-docs/application-builder-overview +163,Create an application,create-an-application,Create a new application in Baserow,"# Create a new Baserow application + +Baserow makes it easy to build applications that fit your needs. If you need to handle a project, keep track of items, or sort customer info, Baserow has a simple platform for you to store, sort, and manage your data. + +We'll show you how to make a Baserow application step by step in this guide. + +## Overview + +Once you log in to your Baserow account, you'll land on your dashboard. This is where you manage all your applications and databases in workspaces. Workspaces provide a structured way to organize your work, and you can [invite collaborators to join you](/user-docs/managing-workspace-collaborators). + +In these workspaces, you can invite others to collaborate with you. To create an application, simply choose an existing workspace or [create a new workspace](/user-docs/setting-up-a-workspace). + +## Create a blank application + +To create a new application, navigate to the workspace where you want to create the application. + +1. On your dashboard, click the **Create new** button. +2. After clicking the **Create new** button, a popup will appear, where you can either select the [Database](/user-docs/intro-to-databases), [Application](/user-docs/application-builder-overview), or [From template](/user-docs/add-database-from-template) option. Select the **Application** option. + + ![Adding a new application][1] + +3. In the pop-up that opens next, give the application a descriptive name. You can subsequently change the application name as needed. + + The application name is for your reference and will not appear anywhere after publishing the application. + + ![Assign a name for your new application][2] + +4. Click **Add application** to finalize the setup. Then, you'll be immediately taken to your new Baserow application and can start working on it. + +You can see default [pages][3] and [elements][4] when you navigate to your newly created application. + +![Baserow Blank application][5] + +## Duplicate an application + +To duplicate an existing application, hover over the application and click the three dots `⋮` icon next to it. Then, choose the **Duplicate** option from the dropdown menu. + +You can monitor the progress of the duplication in the left sidebar. + +Explore further [details about application configurations][6] to maximize your usage. + +## Add an application from template + +The easiest way to get started if you are new to Baserow Application Builder is to copy a [template](/templates/). To start with a template, you need to choose a workspace into which the template will be installed. + +You can add a template in two ways: + + 1. From the template page, or + 2. From your dashboard. + +> Learn more about [how to add a template to a workspace][7]. + +Application Builder templates are paired with Database templates: + +- The **Employee Dashboard Application** is paired with the [Business Goal Tracker](/templates/business-goal-tracker-okrs) template. +- The **Service Requests Manager Application** is paired with the [Commercial Property Management](/templates/commercial-property-management) template. +- The **CRM Application** is paired with the [Lightweight CRM](/templates/lightweight-crm) template. +- **The Task Management Application** is paired with the [Task Management](/templates/personal-task-manager) template. + +![Add an application from template][8] + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/81237e2d-80c9-4fa1-9cb6-2dd8cb2a67f1/Untitled.png + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/49213d31-ed05-4127-89b4-5eff8f422b0a/Untitled%201.png + [3]: /user-docs/pages-in-the-application-builder + [4]: /user-docs/elements-overview + [5]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/4b24657e-adc8-40df-a941-7d690e55b143/Untitled%202.png + [6]: /user-docs/application-builder-configuration + [7]: /user-docs/add-database-from-template + [8]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/6e6c34a6-542e-4117-9033-5328f0420e9c/App%20builder%20template.png",,baserow_user_docs,https://baserow.io/user-docs/create-an-application +164,Application Builder configuration,application-builder-configuration,Baserow app builder setup guide,"# How to configure a Baserow application + +The Application Builder in Baserow makes it easy to create custom applications that fit your unique requirements. With its intuitive interface design and streamlined data entry capabilities, you can enhance collaboration and efficiency in your projects. + +Understanding configurations in Baserow empowers you to effectively organize, manage, and maintain your applications according to your preferences. + +In this section, we'll delve into key features including: + +- [Renaming applications][1] +- [Duplicating applications][2] +- [Creating snapshots][3] +- [Deleting applications][4] + +## Rename an application + +When you create your application, you can assign a name, which can be customized in this section. + +The application name is for your reference and will not appear anywhere after publishing the application. + +To rename an application: + +- In the right sidebar, click the `⋮` icon next to an application. +- Select **Rename** and input a new name for the application. + +![Rename an application][5] + +## Duplicate an application + +Duplicating enables you to create copies of applications within your workspace. It's useful for creating backups, testing new configurations, or maintaining multiple versions of your data. + +If you need to make a copy of an existing application in its current state, hover over the application and click on the three-dot `⋮` icon next to the application. + +Select the **Duplicate** option from the popup. You can view the application and application duplication progress in the left sidebar. + +![Duplicate an application][6] + +After duplicating the application, a copy will be created, and you can start editing. The copy will appear in the same workspace as the original one. + +## Snapshots + +Snapshots are a full copy of your application at the moment when they were created. It allows you to save your current state whenever needed to be able to go back and resume from that state at any time in the future. + +To create a snapshot, select the Snapshot option from the popup, and choose **Snapshots**. [Learn more about snapshots](/user-docs/snapshots). + +After you take a snapshot, you can click on one of the previous snapshot versions and restore it. A duplication of that data will be created when restoring. + +Snapshots are automatically deleted after one year. + +## Delete an application + +You have the option of deleting any of the applications with the workspace. Deleting allows you to remove an application from your workspace. It helps in managing clutter and maintaining a clean and organized workspace. + +To delete an application within your workspace, follow these steps: + +1. Navigate to the application you wish to delete. +2. Click on the **Delete** option in the application menu. +3. Confirm the deletion action in the dialog box that appears afterward. + +Learn more about [recovering data in Baserow](/user-docs/data-recovery-and-deletion). + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: #rename-an-application + [2]: #duplicate-an-application + [3]: #snapshots + [4]: #delete-an-application + [5]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/6bb97779-c977-4af4-89ef-17630712a3bd/Untitled.png + [6]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/c8247625-6f1c-49ab-bd62-e673ca35f88e/Untitled%201.png",,baserow_user_docs,https://baserow.io/user-docs/application-builder-configuration +165,Preview and publish an application,preview-and-publish-application,Preview and publish an application in Baserow,"# Preview and publish a Baserow application + +Previewing and publishing your Baserow application is necessary to make it public and accessible to others. + +In this section, we'll go over the steps to preview and publish your Baserow application. + +![Preview and publish an application][1] + +Make sure you've set up everything right by checking the [necessary configurations](/user-docs/application-builder-configuration). This helps your app work well when it goes live. + +## Preview an application + +Preview mode enables you to test your application's functionality and appearance before making it public. + +Use the preview to make sure your app looks and works like you want it to. + +Just hit the **Preview** button in the top-right of your screen. You can then see how your application is doing. + +## Publish an application + +Publishing your application puts all your updates on the internet right away. Until you publish, no one else can see your application or its pages. + +Before you share your application with the world, double-check its settings, permissions, integrations, and make sure all your [data sources][2] are safe and working right. This keeps your application secure. + +![Publish application][3] + +When you're ready to make your application available to users, configure the publish settings. + +To make your application visible to anyone on the web, follow these steps: + +1. Click on the **Publish** button located within your top navigation bar. +2. You should see your domain and publication status info in the menu that opens. + + > You need to have at least one domain to publish your application. Your application can have multiple domains, each running a different version of the application. Learn more about how to configure your domain link. + > +3. Click on the **Publish** button located within the pop-up window. +4. This action will deploy your changes to the live environment. +5. Once the changes are published, copy the link that you can share with anyone to access your application online. + +Remember: publishing makes your application live and accessible to the public. Make sure your changes are final and ready for public viewing before clicking the **Publish** button. + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/52591df8-4920-402f-8693-310ef2bf1555/Untitled.png + [2]: /user-docs/data-sources + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/0a3bea54-7fd6-428d-a906-d5a94911c058/Untitled%201.png",,baserow_user_docs,https://baserow.io/user-docs/preview-and-publish-application +166,Application settings,application-settings,Application settings in Baserow Application Builder,"# Application settings in Baserow + +Baserow makes managing app settings easy with its user-friendly Application Builder. You can tailor your apps to fit just what you need. + +Let's dive into how to set up your Baserow app. This way, you can make it work just right for you. + +## Overview + +Before you start [creating your application](/user-docs/create-an-application), take a moment to set up some basic settings. + +Here's how to access the application settings: + +1. Look on the left side for the toolbar. +2. Find the application you want to work on. +3. On the right side, click the three dots **`⋮`** next to the application. +4. Choose **Settings** from the options that appear. + +Now, you can easily change the general settings of your application. + +![Application settings][1] + +Next, we'll walk through the different parts of the settings to make sure your application is all set up properly. + +## Domains + +To [publish your application](/user-docs/preview-and-publish-application), you have to link it to a domain. This is necessary before you can make your application accessible publicly. + +Your application can be published in two ways: + +1. You can use a subdomain provided by Baserow, e.g. `yourdomain.baserow.site`. +2. You can use your custom domain, like `yourdomain.com`. + +For each domain you list, you can publish different versions of your application. This flexibility allows you to tailor your application for different audiences or purposes. + +Learn more about [setting up and configuring your domain][2] to make your application publicly available. + +![Associate a domain with your Baserow application][3] + +## Integrations + +When you authorize your account for integrations, everyone with edit permissions to the application gains access to the data you can see. By creating a connection, you let the application use your account to make changes in your Baserow workspace. + +If you want to keep things separate, you can create another user with the right permissions and use that one instead. + +![Create new integrations in Baserow][4] + +You can create new integrations by adding a [data source][5], [event][6], or [user authentication][7]. + +- **[Data source][5]**: Adding a data source means you can work with structured data more flexibly. It lets you use and change data stored in Baserow right in your application. This makes your application more flexible and useful because you can tap into Baserow's strong database features. + + Learn more about [configuring a data source][5]. + +- **Events**: Events allow users to perform specific actions within your application with just a click. These events can range from simple tasks like submitting forms or triggering notifications to complex operations such as initiating workflows or executing API calls. + + Learn more about [events in an application][6]. + +- **[User sources][7]**: User authentication boosts security and personalization in your application. When you set up user sources, you're ensuring that users can safely log in and access their accounts. It also means they get content tailored just for them, adding a personalized touch to their experience. + + Learn more about [configuring a user source][7]. + +## User sources + +To enable users to log in securely, you need to add a user source for authentication. This allows users to access the data stored in the database through your application. + +User sources handle user authentication, registration, and management securely. Once set up, your users can easily sign up, log in, and take control of their accounts within the application. + +Learn more about [configuring a user source][7]. + +## Theme + +In the **Theme** section, you can customize the appearance of [elements][8] by adjusting various parameters. This level of customization allows for consistent styling throughout your application, for a cohesive and aesthetically pleasing user experience. + +![Set theme at the application level][10] + +### Set theme at the application level + +Baserow allows you to configure the overall styling of your application through theme settings. These settings control various visual aspects, including: + + - **Colors:** You can fine-tune the default colors to achieve the desired visual presentation. Define the color scheme for your application elements (backgrounds, text, etc.). + - **Typography**: You can also specify the default font size and color for the headings. Choose the fonts used throughout your application. + - **Page**: Set styling options for different page elements. + - **Button**: Customize the appearance of buttons. + - **Link**: Style the way links are displayed. + - **Image**: Configure how images are presented within the application. + - **Table**: Configure the table border, header, and more within the application. + - **Input**: Set the default input label and header styling. + +![Baserow Application Builder theme styling][11] + +To access and apply theme settings: + + - Navigate to the application you want to customize. + - Click on the three dots (...) located next to the application name. + - Select **Settings** from the menu. + - In the settings modal, click on the **Theme** section. + +This section will display all the available theme settings. You can modify options like color palettes, fonts, and button styles according to your preference. + +### Customize individual elements + +Baserow also allows for [styling specific elements][12] within your page. + + - Select the [element][13] you want to customize. + - Select the **General** tab in the right-hand panel. + - Click the settings icon to open a modal window with element-specific styling options. The available options will depend on the element you selected. + - Make your desired adjustments within the modal window. + +[Learn more about the element styling options][12]. + +### Select font color + +You have two options for selecting a font color: + +- **Hexadecimal color code:** This is a six-digit code preceded by a hashtag (#). Enter a valid hex code (e.g., #FF0000 for red) in the designated field. +- **RGB value:** Specify the color using RGB values. This format specifies the intensity of each color channel on a scale of 0 to 255. (e.g., RGB (255, 0, 0) for red). + +Adjust the opacity for a subtle effect + +![Baserow application hex code][14] + + + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/5c0def74-f8ae-4b95-b1f3-3f7f140aab47/Untitled.png + [2]: /user-docs/add-a-domain-to-an-application + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/284e318b-46c1-440f-98e0-bb0f7897cd89/Untitled%201.png + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/9ea03c51-2868-4243-9190-a13a4cca960e/Untitled%202.png + [5]: /user-docs/data-sources + [6]: /user-docs/element-events + [7]: /user-docs/user-sources + [8]: /user-docs/elements-overview + [9]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/64b7f1dd-caf6-4045-8f97-dbf60a53aa3f/New%20styling%20options%20for%20Application%20Builder.png + [10]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/7a49ef73-4a11-4590-9620-97ff8a295e39/ab_more_styling.webp + [11]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/0c90ab38-2db6-41e6-b34d-eb5609300f9a/ab_styling.webp + [12]: /user-docs/element-style + [13]: /user-docs/add-and-remove-elements + [14]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/752f37fa-c658-4f04-933b-0a879c4bfe09/application%20hex%20code.png",,baserow_user_docs,https://baserow.io/user-docs/application-settings +167,Add a domain,add-a-domain-to-an-application,Add a domain to an application in Baserow,"# Add a domain to an application + +To make an application accessible online, you have to link it to a domain. + +In this section, we'll cover how to publish an application to a custom domain or Baserow subdomain. + +## Overview + +With custom domains, you can publish different versions of your application for each domain you have listed. So if you have multiple domains, you can have a unique version of your app for each one. + +This gives you flexibility and control over how your application is accessed and presented online, making it easier for your users to find and use your app. + +An application can be made publicly available in two ways: + +- **Subdomain by Baserow**: Baserow offers a subdomain where the application can be accessed (*yourdomain.baserow.site*). +- **Custom domain**: You can use a domain name to access the application (*yourdomain.com*). + +You can also have multiple domains, each running a different version of an application. + +![Associate a domain with an application][1] + +## Add a Baserow subdomain + +To publish an application on the Baserow subdomain, + +1. In the Baserow application, go to [Settings](/user-docs/application-settings) → Domains page. +2. Click on the **Add domain** button. +3. Select the Baserow subdomain from the dropdown options. +4. Add a valid domain in the *Domain name* field in the format: `yourdomain`. +5. Click on the **Create** button. + +The DNS settings of the domain will be configured and checked automatically. You don’t need to make any additional changes. + +![Configure Baserow subdomain][2] + +In Baserow, you can use your custom domain to run your applications. This means you can have a web address that's unique to you, instead of using the default Baserow subdomain. + +## Add a custom domain + +Adding a custom domain is a simple yet effective way to establish your brand and make your application more professional. + +In the Baserow application, + +1. Go to [Settings](/user-docs/application-settings) → Domains page. + + ![Associate a domain with a Baserow application][3] + +2. Click on the **Add domain** button. +3. Select a custom domain from the dropdown options. +4. Add a custom domain in the *Domain name* field in the format: `yourdomain.com`. It will also add the full domain `www.yourdomain.com` by default. +5. Click on the **Create** button. + +### Update the DNS for a custom domain + +Every DNS host has its way of updating DNS settings. + +To update your custom domain's DNS, go to your domain registrar's or DNS host's dashboard where you manage your domain. Locate the DNS settings section for your domain and make the changes. + +Create a **CNAME** or **ALIAS** record from your domain: + +- Set the **host** field as your custom domain name. +- Set the **value** field as the base URL you want to point to. + +This process varies slightly depending on your DNS host, but these general steps should help you get started. If you still run into any issues with your domain verification, reach out to your DNS provider to make sure the records are set correctly. + +![Update the DNS for a custom domain][4] + +To verify that the DNS settings are correct and that your domain is correctly pointing to Baserow, publish your application to the custom domain. + +![Create a new ALIAS from your domain to baserow][5] + +Once verified, confirm the changes and wait for them to take effect. This process might take a little time. + +DNS changes may take some time to propagate everywhere, so be patient. It may take up to 48 hours before changes are successfully made from your DNS host so that you can open your application with your domain. + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/38a91bfb-090e-411e-9abc-6367fd8a7683/Untitled.png + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/f40046ce-5415-4fe8-b652-6c845314cf6c/Untitled%201.png + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/67d6b053-8093-4155-96b7-48501b460d8f/Untitled%202.png + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/d7d1a5f6-6c57-4c9f-91d0-05f4ad255145/Untitled%203.png + [5]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/4acc8bb1-8bbc-40b7-b0e0-fc62903907bb/domain%20name.png",,baserow_user_docs,https://baserow.io/user-docs/add-a-domain-to-an-application +168,User sources,user-sources,User sources in Baserow Application Builder,"# User sources in the Application Builder + +User sources are necessary for user authentication in apps. They set up secure access and sign-in steps. To let users sign into an application, you need to add a user source. + +We'll show you how to handle user sources in a Baserow application here. + +## Overview + +When you add a user source, you're deciding how users will log into the application. You'll adjust the settings for signing in. With these, users can enter their usernames and passwords to get into the application and use the data. + +You'll find a list of all the user sources you've connected, along with a button to add a new one. This makes it easy to manage who can access the application and how they do it. + +The login element allows users to access an application with secure credentials. [Learn more about the login element][1]. + +## Add a user source + +Adding a user source allows the application to recognize and authenticate users effectively. + +1. Go to the Settings → Users page. +2. Click on **Add user source**. +3. Choose the type of user source you want to add. +4. Select an integration from the dropdown menu or click **Add new integration** directly. +Learn more about [integrations and how to configure them](/user-docs/application-settings#integrations). +5. Click **Create**. + + ![Add new user source in Baserow][2] + +After you create a user source, the user settings will become available. + +## Configure user source + +To edit the user source for authentication, follow these steps: + + 1. Navigate to Application settings → Users. + 2. Locate the user source that you want to edit. + 3. Click the option to edit or modify the existing user source. + + ![Edit or modify the existing user source][3] + + 4. Review the integration details, including the integration with your database. + 5. Specify the [database][4] and [table][5] from your [workspace][6] that you want to use for user authentication. The items in the list can be sorted and filtered according to the sorting and filtering configuration of the default view. + 6. Select the appropriate fields in the table that match the user information. Typically, the email field is used for identification purposes. + + ![Baserow authentication method is set to ""Email/Password""][7] + + 7. You can enable multiple authentication methods simultaneously: + 8. Email/Password: Will allow users to authenticate using their email + and password and select the password field from your users table as + the source in the dropdown. + > The [password field type](/user-docs/password-field) is a write-only field. It lets you set a password for each row. This password is stored as a hash and is *never* shown. + > + + + 9. SAML SSO + - In the ""Edit provider: SAML SSO"" dialog: Enter your SAML Domain + (for example okta.com). + - Paste your Identity Provider metadata in + the Metadata field. + - The Default Relay State URL will become + available after adding domains under the domains tab in your app + settings. + - Note the Single Sign-On URL (to be shared with + your identity provider). + - Click on ""SAML Response Attributes"" to expand attribute mapping options +- Configure the following fields to match your identity provider's attribute names: + +Email: The attribute containing the user's email (default: user.email) +First name: The attribute for the user's first name (default: user.first_name) +Last name: The attribute for the user's last name (default: user.last_name) + +>Email will be used as the username for the user +First name can contain the full name if Last name is not provided +Last name is optional and can be cleared to provide the full name via First name + + 10. OpenID Connect + + - Click ""Add provider"" near the OpenID Connect checkbox + +In the ""Edit provider: OpenID Connect"" dialog: + +- Enter a custom provider name +- Enter the provider's base URL +- Enter the provider's client ID + -Enter the provider's secret + +> Note the Callback URLs to add to your OpenID provider's redirect URI settings > + + 11. Once all authentication methods are configured, click ""Save"" + +Save the changes to update the user source configuration. + +Once the user source is added and configured, users can [authenticate using any of the enabled methods][8]. + + + [1]: /user-docs/application-builder-login-element + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/6d45e4f5-599b-4e31-a657-2aacb34bd692/Untitled.png + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/be3c6300-82b8-4a4b-8d79-f0a5d8106456/Untitled%201.png + [4]: /user-docs/intro-to-databases + [5]: /user-docs/intro-to-tables + [6]: /user-docs/intro-to-workspaces + [7]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/user_files/LB83JhEcG8GJEO4h7w4Qz7NGcXbYZO4r_371c320df226e3b3544246e1d837af782cc39c66c0bb54389943752a5e904b47.png + [8]: /user-docs/application-builder-login-element",,baserow_user_docs,https://baserow.io/user-docs/user-sources +169,Pages overview,pages-in-the-application-builder,Pages overview in Baserow Application Builder,"# Pages in the Application Builder + +An application can have lots of pages, and each one has its own job. Imagine pages like tables in a database. They help you sort and keep different types of info. To put data into an application, you must make at least one page. + +Let's look at the basics of handling pages in the Baserow application builder. + +## Overview + +After you've created an application, you can find its pages listed on the left sidebar. You can create new pages and manage all existing ones right from the sidebar in Baserow. + +A page in an application has its unique set of settings that can be configured for each page separately, including [Name, Path, and Path parameters][1]. + +Each page has a three-dot icon `⋮` on it, which opens a menu with the options to [rename][2], [duplicate][3], and [delete][4] the page. + + + +## Create a page + +In Baserow, you have the flexibility to create a new, blank page and add [elements][5] to suit your needs. + +When you create a new application, the application will have a Homepage by default. To expand an application's functionality, add additional pages. + +There are ways to add a new page to an application: + +- [Start with a new page][6] +- [Duplicate an existing page][3] + +### Start with a new page + +In this section, we will walk you through the process of adding a page to an application. + +1. Within the application in the sidebar, click **+ Create page**. +2. Input a name for the new page. When you create a new page, you should give it a distinctive name that’s not the same as any other page name in the current application. +3. Select **Start with a new page**. +4. Click **Add page**. + +When you create a new page, it's like starting with a blank canvas. You have access to various elements you can add to this blank page. These elements help you organize and present information effectively. + +![Start with a new page][7] + +### Duplicate a page + +Duplicating a page is a quick and easy way to make a copy of an existing page. This can be helpful if you need to make changes to the data without affecting the original page. + +To duplicate a page in Baserow, follow these steps: + +1. In the sidebar, hover over the page you want to duplicate. You will see a small vertical ellipsis `⋮` (three dots) appear on the page. +2. Click the three-dot icon `⋮` to open the page options menu. +3. From the menu, select **Duplicate**. + +Baserow will create a copy of the page and place it immediately below the original page. You can view the application and page duplication progress in the left sidebar. + +### Customize a duplicated page + +After duplicating a page in Baserow, you’ll likely want to customize the duplicated page to fit your needs. + +Here are some ways you can customize duplicated pages: + +- [Modify the values of specific elements][8]: Click on an element within the duplicated page and change its value to the desired value. +- [Delete unnecessary elements][9]: If the duplicated page contains elements that are not relevant, you can remove the element. +- [Reorder elements][8]: Click and drag an element to a different position within the page to rearrange the element order. + +## Rename a page + +Each page is assigned a unique name when created, but you can edit that. + +1. Locate the page you want to rename. +2. Click the **Rename** option next to the page name. +3. Once you've entered the new name, save the changes or confirm the edit according to the instructions provided. +4. Verify that the page now displays the updated name in the dashboard. + +Within the page settings, you can also find the option to change the page name. Click on the field containing the current page name and add a desired new name. + +![Rename page in page settings][10] + +## See what a page looks like to users + +You can view a page as an authenticated user and evaluate the user experience from the perspective of an end-users. + +By default, when you visit the editor, you're viewing as an anonymous user. + +![See what a page looks like to users][11] + +To view a page as an authenticated user, follow these steps: + +1. **[Create user sources][12]**: Ensure you have configured user sources and defined authentication methods like email/password. +2. **[Create data sources][13]**: Data sources allow you to display data to users or collect some data from them instead. +3. **Access the page**: Once logged in, navigate to the page you want to view as an authenticated user. You should be able to access any page that requires authentication based on user role and permissions. +4. **Simulate user experience**: Explore the page and interact with its features as an authenticated user would. Test functionalities such as accessing restricted content, submitting forms, or viewing personalized data based on the user's profile. +5. **Verify user experience**: Ensure that the page behaves as expected for authenticated users. Check for any errors, discrepancies, or unauthorized access to content that may indicate issues with the authentication setup or page configuration. + +## Delete a page + +To delete a page from an application, use the **Delete** option within the application's management interface. + +This action removes the selected page from the application without any additional steps or warning prompts. + +## Page settings + +You can access the page settings by opening the page. On the left-hand side of the top navigation bar, you can access [Elements][5], [Data][13], and [Page settings][1]. + +Learn more about the [page settings][1]. + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: /user-docs/application-builder-page-settings + [2]: #rename-a-page + [3]: #duplicate-a-page + [4]: #delete-a-page + [5]: /user-docs/elements-overview + [6]: #start-with-a-new-page + [7]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/7b32e88c-6131-4bb6-b03e-c626b772c0ba/Untitled.png + [8]: /user-docs/elements-overview + [9]: /user-docs/add-and-remove-elements + [10]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/f494fc54-f994-466f-b486-29aeedbd7e50/Untitled%201.png + [11]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/4726ef47-d1b8-442d-9623-17a1c46f3e35/Untitled%202.png + [12]: /user-docs/user-sources + [13]: /user-docs/data-sources",,baserow_user_docs,https://baserow.io/user-docs/pages-in-the-application-builder +170,Data sources,data-sources,Data sources in Baserow Application Builder,"# Data sources in an application + +In Application Builder, data sources are key for showing data to users or getting info from them. They help get data and show it on the page. + +Let's talk about how to connect data to a Baserow application so you can use all its features. + + + +## Overview + +With Baserow, you can add multiple data sources to your application, even on the same page. + +You don't have to connect a data source to your Baserow application, but it's essential if you want more than a simple site with static content. This link lets you get and change data in real-time, making for interactive and fun user experiences. + +When you tie a data source to your Baserow application, the data shows up on the page right away. Changes to the data show up instantly in your application, and you don't have to republish anything. + +## Add new data source + +Let's explore how to connect a data source. + +Navigate to the top navigation bar on the left-hand side of the page, where you'll find options for [Elements][1], Data, and [Page settings][2]. + +To add a new data source, click on Data Source in the top navigation bar. A popup will appear, displaying a list of all currently connected data sources, along with an option to add a new one. + +1. Click **Add new data source**. +2. Select a service type. + - Get single row - Finds a single row in a given table. + - List multiple rows - Finds a page of rows in a given table. + + ![Add new data source in Baserow ][3] + +3. Select an integration from the dropdown menu or click **Add new integration** directly. Learn more about integrations and how to configure them. +4. As soon as you select a service type and integration, the element settings will become available. +5. Select a [Database](/user-docs/intro-to-databases), [Table](/user-docs/intro-to-tables), and [View](/user-docs/overview-of-baserow-views) from the [workspace](/user-docs/intro-to-workspaces). The items in the list can be sorted and filtered according to the sorting and filtering configuration of that particular view. +6. When you select the *Get single row* service type, you need to enter or map a [row ID](/user-docs/overview-of-rows#what-is-a-row-identifier) to retrieve a single row in a given table by its ID. Leave this value empty to return the first row in the table. + + > To dynamically input a [row ID](/user-docs/overview-of-rows#what-is-a-row-identifier) and retrieve a single row in a given table by its ID, add a [page parameter][2] to the page or add a [user source][4]. + > + + ![Retrieve a single row in a given table by its ID][5] + + +## Filter data source + +Data source filters allow you to display Baserow table rows based on specific conditions you define. Before diving in, you must select a table to start using data source filters. + +Learn more about [filters in Baserow](/user-docs/filters-in-baserow). + +To show rows that apply to the conditions set: + +1. Click **+ Add additional filter**. +2. Select any field from the dropdown menu to apply the filter. +3. Specify the condition you wish to use for filtering. +4. Define the value of the field to display, such as a specific word, status, or numerical value. + +The items in the list will be filtered according to the filtering configuration of that particular view. + +![Filter data source][6] + +You have the flexibility to filter rows by selecting multiple fields and applying various filters simultaneously using either `And` or `Or` conditions. + +### Apply filters in the Application Builder + +Understanding how filters interact between the Database and the Application Builder is important. It allows you to effectively manage filters between your database and the Application Builder, ensuring that your data is filtered precisely as needed. + +**Selecting a table without a specific view:** + +When selecting a table from the database without specifying a particular view in the data source filter configuration, any filters associated with views in the table won’t affect the results in the Application Builder. This means you can independently filter the rows displayed in the Application Builder, regardless of any view filters from the database. + +This is useful when the views in the database table already have specific filters that you prefer not to use in the Application Builder. + +**Selecting a table and view to apply an additional filter:** + +When you select both a table and a view in the data source filter configuration, the filters you set are applied. Additionally, any filters present in the selected view within the database table will also be applied in the Application Builder. In this case, the filters at the table-level take priority, and then the filters at the Application Builder level only filter down the visible rows. + +This is useful when you have specific filters in the view within the database table that are essential, but for further filtering in the Application Builder, additional filters are required. + +### Use formula to filter data source + +You can enter plain text or use formulas for certain filters of your data sources. It can be used in conjunction with [page parameters][2] to define what to fetch from a data source and works with a *Get row* service type if you don't specify the [row ID](/user-docs/overview-of-rows#what-is-a-row-identifier). + +To add a formula to filter data, use the ""Sum"" symbol next to the field value: + +![Formula to Filter data source in Baserow][7] + +## Sort data source + +> This option is available for the *List multiple rows* service type. +> + +Sorting data sources in Baserow puts data in order based on specific criteria, like their names or numbers. + +When you select a field to sort by, Baserow arranges the rows based on that field's values. You can even choose multiple fields if you want to sort by more than one criteria, like first sorting by name and then by age. + +Learn more about [sorting data in Baserow](/user-docs/guide-to-grid-view#sort-grid-view). + +Click **Sorts** → **Add additional sort** to select a field to sort rows by. This will reveal any sort applied. + +Each field will have ascending and descending order options. + +![Sort data source][8] + +You can add more sorts by picking more fields to sort by. To apply a new sort, click the **Add additional sort** and then select another field from the dropdown menu. + +### Apply sorts in an application + +If you apply sorts, regardless of whether you select a view, only the sorts defined within the data source configuration will be applied to your data. This ensures that the sorting criteria you specify within the Application Builder take precedence over any predefined sorts associated with the selected view. + +There are four ways of sorting records in your list rows data source: + + - A data source with no view selected and data source sorting: you can apply a sorting to this specific data source set. + - A data source with a view selected and no data source sorting: the rows will be sorted by what has been set up in the database module’s sorting. + - A data source with a view selected and with data source sorting: the rows are sorted by the database module’s sorting, then the data source’s sorting replaces it. + - The external user sorting is available for the fields you selected in “User actions”. These sorts aren’t persisted and just applied on the fly. + +**When no sorts are applied:** + +If you do not apply any sorting configurations within the data source configuration, and you have selected a view for your data source. In that case, the sorting criteria defined within the selected view will be used. In this scenario, the sorting rules set within the view settings will control the table rows displayed. + +This allows you to tailor your sorting preferences according to your specific requirements, whether using the sorting options within the data source configuration or relying on the predefined sorts associated with the selected view in the database. + +## Refresh data source + +Refreshing a data source triggers an update of the data for the [selected element][1]. It verifies if there have been any changes to the data in the source since it was last retrieved. This action is particularly useful after you've created or updated a row of data, ensuring you're working with the most recent information. + +Click **Refresh fields from data source** located within the General panel on the right side of the application interface to verify if any changes have been made to the underlying data source and incorporate those changes into your element. + +![Data source refresh action for the Application Builder][9] + +## Search data source + +To search the data source, specify a search term. You have the flexibility to choose the term for the search, giving you control over the query's focus. + +If no specific term is provided, the search will encompass all list items, offering a comprehensive view of the available data. + +![Search data source][10] + +## Share data source + +Shared data sources in Baserow’s Application Builder allow you to add a data source that’s usable across multiple pages within your application. This boosts efficiency and saves time so you don’t need to add the same data source on multiple pages. + +To create a shared data source, go to the ‘Data Sources’ tab. There, you can set up ‘Share between pages’ for a new data source or an existing one, marking it as available throughout different pages. + +![Image: Shared data sources in Baserow][11] + +## Delete data source + +Deleting a data source permanently removes its associated information from the application. + +To remove a data source from an application: + + 1. Identify the data source you wish to delete. + 2. Locate the trash icon positioned on the right-hand side of the data source. + 3. Click on the trash icon to initiate the deletion process. + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: /user-docs/elements-overview + [2]: /user-docs/application-builder-page-settings + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/913b0e52-5768-4f8b-99b7-f5c4499d26ae/Untitled.png + [4]: /user-docs/user-sources + [5]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/00527587-cb5b-478f-8bd1-77b83e6822ad/Untitled%201.png + [6]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/a68f5dac-22f7-47b2-8740-f28b27e4c23d/Untitled%202.png + [7]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/81208b12-5689-4ef5-99c3-d4f0f51cfcdb/Untitled%203.png + [8]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/87132eda-aaa2-497d-aa17-4bc5c663ac9c/Untitled%204.png + [9]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/fbb91832-6fbf-4842-a0ed-fce23566cfb5/Data%20source%20refresh%20action%20for%20the%20Application%20Builder.png + [10]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/dd7aeeee-edad-47bd-9640-5d3f28f0d51f/Untitled%205.png + [11]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/b71bc3ae-9917-41cd-a75d-8e434974d5d6/shared_data_sources.webp",,baserow_user_docs,https://baserow.io/user-docs/data-sources +171,Page settings,application-builder-page-settings,Page settings in Baserow Application Builder,"# Page settings in an application + +In this section, we will cover page settings. + +You can access the page settings by opening the page. On the left-hand side of the top navigation bar, you can access [Elements][1], [Data](/user-docs/data-sources), and [Page settings](/user-docs/pages-in-the-application-builder). + +Learn more about how to [create a new page and manage existing pages](/user-docs/pages-in-the-application-builder). + +## Overview + +In the Page section, you have the Page name, Path, and Path parameters fields, where you can edit the name and path you had assigned to the page on creation. + +![Baserow Page settings][2] + +## Page name + +Edit the name and path assigned to your page for clarity and organization. + +Learn more about [renaming pages in this support article](/user-docs/pages-in-the-application-builder#rename-a-page). + +## Page path + +The path of the page can be found in Page Settings → Page. + +To define the path of a page, use the `/path` format. This represents the location of the page within the application's structure. + +For instance, if you have a page named ""About"" that is located directly under the root directory of your application, its path would be `/about`. + +To link to your homepage, simply use `/` as a reference. + +The page `/path` is useful for organizing content hierarchically, such as categorizing products in an e-commerce site `/electronics/phones/smartphones`. It helps users and search engines navigate the website efficiently. + +![Page path][3] + +## Path parameters + +Path parameters act as placeholders in URLs to load data dynamically to specific parameters. With path parameters, you can retrieve data to make content more personalized. + +You can include a parameter by using the syntax `:parameter` within the path. This allows for flexibility in specifying endpoints and fetching relevant data based on the parameters provided in the URL. + +For example, if you have an endpoint like `/users/:userId`. Here, `:userId` acts as the path parameter, allowing you to fetch data specific to the user whose ID is supplied in the request. + +![Path parameters][4] + +## Page visibility + +The page visibility feature lets you control which user groups can see specific pages in your applications. This provides more detailed control over page-level permissions, complementing the existing [element-level visibility settings][8]. + +To set page visibility, navigate to **Page settings** in the top menu and select the **Visibility** tab. Here you can specify who can view this page: + + - All visitors + - Logged-in users (define roles if needed) + +You can [create a login page][5] for your application. When a visitor tries to access a page that requires authentication, they will be redirected to the configured login page. + +> Learn more about the [login element][6] to allow users to access the application with secure credentials. + +![Image: Baserow app builder page_visibility][7] + +## Related content + + - [Element visibility][8] + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: /user-docs/elements-overview + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/4ec4269f-f62e-4a1a-a160-59bbbff536a4/Untitled.png + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/fa42e805-3d7d-41cd-ad65-2d8b9304701e/Untitled%201.png + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/3de676ea-ff35-4bd4-b029-40cf4368c1ec/Untitled%202.png + [5]: https://baserow.io/user-docs/pages-in-the-application-builder + [6]: https://baserow.io/user-docs/application-builder-login-element + [7]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/834344cd-7c1d-4cf6-b61b-5314538c1815/page_visibility.webp + [8]: /user-docs/application-builder-element-visibility",,baserow_user_docs,https://baserow.io/user-docs/application-builder-page-settings +172,Elements overview,elements-overview,Application Builder elements in Baserow,"# Application Builder elements overview + +Applications are built with essential components known as elements. Elements act as the building blocks for applications. They are what bring functionality and life to the application. + +In this section, we’ll cover how to work with elements within an application. + +In the following articles, we’ll talk more about the different available elements. + +## Overview + +You can move elements around, link pages, and set up how they connect within your application. + +> You can navigate and build with Baserow's Application Builder using only your keyboard. [Use keyboard shortcuts for quick actions][1]. + +Like [pages in the Application Builder](/user-docs/pages-in-the-application-builder), each element has its own settings for things like element [details][2], [styles][3], and [events][4]. These settings change based on what kind of element it is. + +When you work with elements, you have lots of choices. If you hover over one, you'll see a toolbar with different tools. After adding an element, there's a menu at the top with more options. You can shift, copy, or remove elements using the icons given. + +## Element types + +There are static elements such as the [Heading][5], [Columns][6], [Form][7] elements, etc. They help tell people about stuff like products or portfolios. + +Then, there are dynamic elements, which work in combination with a [data source](/user-docs/data-sources) to represent data in all sorts of different ways, such as the [Table][8] element. + +Here's a list of the elements available: + +| Element | Description | +| --- | --- | +| [Heading][5] | A title displayed at the top of a page or section. | +| [Text][9] | A single line of text. | +| [Link][10] | A hyperlink to another page or URL. | +| [Image][11] | An element to display an image. | +| [Text input][12] | A field where users can input text. | +| [Columns][6] | A container to organize content into multiple columns. | +| [Button][13] | A clickable button that performs an action when clicked. | +| [Table][8] | An element to display data in rows and columns. | +| [Form][7] | A container for gathering and submitting user input. | +| [Choice][14] | A menu for users to select one option from a list of options. | +| [Checkbox][15] | A small box for users to select an option. | +| [IFrame][16] | An inline frame to embed another document within the current page. | +| [Login][17] | A user login form | +| [Repeat][18] | Display lists or collections of data | +| [Record selector][19] | Allows users to link and select related rows from other tables | +| [Date time picker][20] | Input dates and times in your application | +| [Multi-page header and footer][21] | Create a reusable container that can be used across multiple pages. | + +## Element properties + +Page formatting is designed to be flexible, so you can move elements around on the [page](/user-docs/pages-in-the-application-builder) easily. + +Every element has unique properties and ways to format it based on what it's for. + +To set up an element just right, click on it. You'll see a list of its properties on the right side of your screen. + +![Element properties][22] + +Each element provides adaptable and user-friendly customization to tailor your page layout precisely to your needs. + +Hover over any element to reveal a range of options: + +- [Duplicate an element][23] +- [Select the parent element][24] +- [Move an element][25] +- [Delete an element][26] + +![Element properties][27] + +## Set the element data source + +Setting a [data source](/user-docs/data-sources) tells an element where to get the data it needs to show. This data can be typed in by you (static data) or pulled from a database (dynamic data). + +When you pick a data source for an element, you're showing it where to look for its information. + +To choose a data source for an element, click on it and check the sidebar on the right. Click on the field and select data from a list of already set up sources. + +[Learn more about adding a data source](/user-docs/data-sources). + +![Set the element data source][28] + +If you need to change the data source for an element later on, simply click on the field again and select a different source from the list provided. + +## Select parent element + +Selecting the parent element refers to identifying and targeting the container or wrapper of a specific element. + +> You can navigate and build with Baserow's Application Builder using only your keyboard. [Use keyboard shortcuts for quick actions][1]. + +![Select parent element][29] + +You can also click on **Elements** in the top bar to target elements based on their relationship to another element. + +## Move element + +To move the element up or down on the [page](/user-docs/pages-in-the-application-builder), you can use the arrows to change the element's position. + +> You can navigate and build with Baserow's Application Builder using only your keyboard. [Use keyboard shortcuts for quick actions][1]. + +Clicking the up arrow moves the element higher, while the down arrow shifts it lower on the page. + +![Move element][30] + +## User actions + +External users can filter, sort, and search within [published applications][31], creating a more interactive and user-friendly experience. + +For applicable elements, you can specify which fields to make filterable, sortable, and searchable for your external users. + +To add filtering, ordering, and searching capabilities, click on the element and navigate to the right sidebar. There, you’ll see checkboxes to enable Filter, Sort, and Search for specific fields. + +![image: filter_order_and_search_for_published_applications][32] + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: /user-docs/baserow-keyboard-shortcuts + [2]: /user-docs/add-and-remove-elements + [3]: /user-docs/element-style + [4]: /user-docs/element-events + [5]: /user-docs/application-builder-heading-element + [6]: /user-docs/application-builder-columns-element + [7]: /user-docs/application-builder-form-element + [8]: /user-docs/application-builder-table-element + [9]: /user-docs/application-builder-text-element + [10]: /user-docs/application-builder-link-element + [11]: /user-docs/application-builder-image-element + [12]: /user-docs/application-builder-text-input-element + [13]: /user-docs/application-builder-button-element + [14]: /user-docs/application-builder-dropdown-element + [15]: /user-docs/application-builder-checkbox-element + [16]: /user-docs/application-builder-iframe-element + [17]: /user-docs/application-builder-login-element + [18]: /user-docs/application-builder-repeat-element + [19]: /user-docs/application-builder-record-selector-element + [20]: /user-docs/application-builder-date-time-picker-element + [21]: /user-docs/application-builder-multi-page-container + [22]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/98835a08-3c77-4d3e-b9a0-d2d431602c4b/Untitled.png + [23]: /user-docs/add-and-remove-elements#duplicate-element + [24]: #select-parent-element + [25]: #move-element + [26]: /user-docs/add-and-remove-elements#remove-element-from-a-page + [27]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/da63d98d-c8ef-4999-b8b3-21549dfa4dd1/Untitled%201.png + [28]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/57bb6236-faed-4158-828c-0ad4461fee9b/Untitled%202.png + [29]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/53a3c91d-bd66-4b8a-8205-bd22a7378d74/Untitled%203.png + [30]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/1aea659a-bd32-43b7-91db-b2da5f4f9e2b/Untitled%204.png + [31]: /user-docs/preview-and-publish-application + [32]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/3344732f-7eca-4ec1-b38e-e0d00a89952a/filter_order_and_search_for_published_applications.webp",,baserow_user_docs,https://baserow.io/user-docs/elements-overview +173,Add and remove elements,add-and-remove-elements,Add and remove elements in Baserow application builder,"# Add and remove elements in Application Builder + +Adding elements involves introducing new components such as text, images, buttons, or forms onto a page. Removing elements covers deleting existing content from the page. + +In this section, we'll explore adding and removing elements on a page, best practices, and the impact they have on the overall user experience. + +Learn more about the [elements available in the application builder][1]. + +## Overview + +In application design, integrating various elements onto a single page enhances user experience and navigation efficiency. By combining forms, buttons, text fields, images, and interactive features, you create cohesive interfaces. + +It's important to maintain clarity and organization to prevent clutter and confusion for users. + +## Add an element to a page + +Adding elements enhances the structure and content of a page, offering flexibility and customization options. + +To add an element to a page, follow these steps: + +1. Open the page and click **Elements**. +2. Click **Element +** located in the lower left portion of the popup. Alternatively, click on the plus icon `+` on the page to add an element. + + ![Add elements to a page][2] + +3. A menu of available element options will appear. Select from the available options or use the search box to find a specific element by name. + + ![List of application builder elements][3] + +4. Once you've chosen the element you want to add, click on it. + +After selecting the element, you can place it anywhere on the layout of the page. Don't worry too much about perfect positioning at this stage; you can always adjust it later as needed. + +## Duplicate element + +Duplicating an element creates an identical copy of it, usually positioned right below the original. + +This provides multiple instances of the same element without the need to recreate it from scratch. + +> You can navigate and build with Baserow's Application Builder using only your keyboard. [Use keyboard shortcuts for quick actions][4]. + +To duplicate an element: + +1. Hover over the element you want to duplicate. +2. Locate and click the double square icon. + +This action creates a duplicate of the selected element within the application, giving you the freedom to tweak and adjust the duplicated version without altering the original. + +![Duplicate element][5] + +## Remove element from a page + +To remove the element from the page, follow these steps: + +1. Locate the trash icon associated with the element you wish to delete. +2. Click on the trash icon to initiate the deletion process. +3. Confirm the deletion if prompted. + +We advise that you proceed with this action only if you are certain you no longer need the element. + +![Remove elements from a page][6] + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account + + [1]: /user-docs/elements-overview + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/f42c73c7-0468-46e7-9dce-849eb75262a6/Untitled.png + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/fffbb555-89f0-4efd-bacb-c82e96b12291/Untitled%201.png + [4]: /user-docs/baserow-keyboard-shortcuts + [5]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/23e29afd-c54f-4966-9191-af2c67f8389a/Untitled%202.png + [6]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/7779142b-0a3c-426e-ab39-c271f42e113a/Untitled%203.png",,baserow_user_docs,https://baserow.io/user-docs/add-and-remove-elements +174,Element style,element-style,Baserow application builder element style,"# Application builder element style + +Element style is key to the look and feel of a webpage. It's about the design features you add to parts like buttons, forms, and text fields. + +In this section, we'll look at style options that help you show your data in a clear and engaging way. + +## Overview + +The Application Builder offers a wide range of customization options to personalize the look and feel of a [page](/user-docs/pages-in-the-application-builder). You can control everything, from color schemes, to typography, and spacing. + +Each [element](/user-docs/elements-overview) on a [page](/user-docs/pages-in-the-application-builder) has its own style editor on the right sidebar. This area has everything you need to change how an element looks, like colors and fonts. + +You can set the font style and size, as well as the color, for each element on its own. This lets you make an app that's both good-looking and easy to understand. + +Alternatively, you can choose to inherit the default styles defined in your [theme settings](/user-docs/application-settings#theme) for a cohesive look. + +![Style element][1] + +## Set theme + +Baserow allows for the customization of specific elements on your page. To do this, select the element you want to customize, go to the **General** tab in the right-hand panel, and click the settings icon to open a modal window with styling options. The available options will vary depending on the element selected. Make the desired adjustments within the modal window. + +[Learn more about how to customize your applications at the application level][2]. + +## Element border + +To add a top and bottom border to an element and customize the border width and color, follow these steps: + +1. **Select the element**: Identify the element to which you want to add the borders. +2. **Access the style editor**: Navigate to the style editor of the selected element. +3. **Specify border width and color**: There are options to set borders for different sides (top, bottom, left, right) separately. Set the width and color of the borders. +4. **Preview and adjust**: After setting the border properties, preview your changes to ensure they look as expected. + +By following these steps, you can easily add custom borders with the desired width and color to elements within a page. + +## Element padding + +Padding offers control over the spacing between the content and the border of an element. + +Padding creates a buffer zone around the content, giving you control over the layout and visual hierarchy of the page. + +- **Left and Right Padding:** This adjusts the horizontal space between the content and the left and right borders of the element. +- **Top Padding:** This controls the vertical space between the content and the top border, impacting how close the content sits to the top of the element. +- **Bottom Padding:** This adjusts the vertical space between the content and the bottom border, affecting how close the content sits to the bottom of the element. + +## Element background color + +Background colors enhance the visual design and user experience of a page. Setting a background color for an element fills the entire area of that element. + +Adding a background color gives a spotlight to certain elements on a page. + +![Background color][3] + +To change the default background color, adjust the color in the [theme settings](/user-docs/application-settings). This will cause any element using the colored background to update. + +You can remove an existing background color at any time by selecting **None**. + +## Element width + +Element width determines how much horizontal space an element takes up on the screen. Essentially, it controls how wide your element will be. + +Baserow Application Builder offers several options for customizing element width: + +- **Full Width:** Stretches the element to fill the entire available space. +- **Normal:** Sets the element to a standard width, creating a balanced layout. +- **Medium:** Makes the element slightly narrower than the normal width. +- **Small:** Creates the narrowest size option for the element. + +Each choice corresponds to a specific width setting, allowing you to tailor the layout according to your design needs. + +![Width][4] + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/26d9b670-4d8a-49a7-bfa1-cf1197d9fa3b/Untitled.png + [2]: /user-docs/application-settings#theme + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/9cd19c33-5ae9-4115-9f68-c189609f6088/Untitled%201.png + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/9c2c8f51-2c0a-4b37-ba11-dcc2344c0736/Untitled%202.png",,baserow_user_docs,https://baserow.io/user-docs/element-style +175,Element events,element-events,Baserow Application Builder element events,"# Application Builder element events + +Element events let you decide what happens when someone clicks on things like buttons. This makes the user experience lively and responsive. + +Here, we'll look at how to make buttons interactive in an application. By connecting button clicks to certain actions, you make the user experience better and guide the way the application works. + +![Events][1] + +## Overview + +Events are triggers within your application that respond to user interactions, like [clicking a button][2], [logging in][3], or [submitting a form][4]. They bridge the gap between user input and actions on the application's data. + +You can create an action on click or after login. + +Here's an overview of the actions: + + - **Show notification**: This action triggers a notification to alert users about updates, messages, or system events within the application. + - **Open page**: This action opens an external URL. + - **Logout**: This action logs a user out of the application. + - **Refresh data source**: This triggers the data sources on the page to be refreshed to account for recent changes. + - **Send HTTP request**: Allows you to send requests to external APIs and services. + - **Send email**: Sends a customized email to specified recipients directly from the application, enabling automated communication using any SMTP server of your choice. + - **Create row**: This action creates a new row in the selected table. Choose a table to begin configuring fields. + - **Update row**: This action updates an existing row in the selected table. Choose a table to begin configuring fields. + - **Delete a row**: This action deletes an existing row in the selected table. Choose a table to begin configuring fields. + +You can reorganize the events using the drag-and-drop handle. + + + +## Element action: Show notification + +Notifications are key for user feedback in your application. + +The ""Show notification"" feature in Application Builder lets you make short messages that pop up on the screen. They tell users about what's happening in your application and then disappear quickly. This way, users get updates without any mess on the screen. + +For example, when someone sends a form, they can't see what happens next. They might wonder if it worked. That's where ""Show notification"" comes in. It gives them a clear message like ""Form submitted successfully!"" or ""Thank you for your inquiry!"" to let them know everything was successful. + +![Show notification][5] + +## Element action: Open a page + +When a user clicks the button, it directs them to another page. + +This feature is perfect for when you want users to go to a certain page after logging in or on click. It could be a confirmation page, a thank you page, or a page with more information. + +This improves user flow by directing users to a specific web address. It's handy for accessing related links. + +## Element action: HTTP request + +The HTTP request action allows you to send requests to external APIs and services directly from your application. This powerful feature enables integration with third-party systems, data submission to external endpoints, and triggering of external workflows. + +Here's how it works: + +1. **Choose HTTP method**: Select the appropriate HTTP method (GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS) for your request. +2. **Configure the endpoint url**: Specify the URL of the API endpoint you want to send the request to. +3. **Set query parameters**: Add any necessary query parameters. +4. **Set headers**: Add any necessary headers for authentication, content type, or other requirements. +5. **Select body type**: Body content can be sent as JSON, form multipart and raw. +6. **Include request body content**: Set the body content, you can include data from form fields or other available data sources. +7. **Timeout**: Set the amount of time this request has to succeed before timing out and failing. + +This action is perfect for integrating with payment processors, sending data to CRM systems, triggering automated workflows, or communicating with any external API that your application needs to interact with. + +## Element action: Create a row + +This event lets users submit data that [creates a new row in a table](/user-docs/how-to-make-new-rows). It's perfect for building forms to collect data, like applications, feedback, or purchase orders. + +Here's how it works: + +1. **Choose a database**: Select the database containing the table where you want to create new rows. +2. **Specify the target table**: Pick the specific table within the chosen database that will receive the new rows. +3. **Map form fields**: Match the fields in the form with the corresponding fields in the table. This ensures the data gets placed in the correct location within each row. + +For example: A job application form creates a new record in a ""Job Applications"" table with the applicant's details and the specific job they're applying for. Whenever an applicant submits the form, a new row will be created in the table, automatically capturing their information. + +![Create a row event in Baserow Application Builder][6] + +## Element event: Update an existing row + +This event allows users to modify existing data entries within the application. It facilitates the editing process, allowing users to make necessary changes to the data. + +For example, if you have a list of tasks, the task page can contain a form through which employees can request task changes. + +1. **Configure the update action:** In the Events tab of the Application Builder, select the [integration](/user-docs/application-settings), [database](/user-docs/intro-to-databases), [table](/user-docs/intro-to-tables), and specific [row](/user-docs/overview-of-rows) you want to update after the event occurs. +2. **Define updatable fields:** Choose which data fields from the application users can modify through the form. + +After the event occurs, the application automatically updates the designated row with the new information, reflecting the user's requested changes. + +![Update row event in Baserow Application Builder][7] + +## Element event: Send an email with SMTP + +You can send custom emails using the **Send email** action inside your workflow. All you need is access to an SMTP server like Gmail, Outlook, or your company mail. + +--- + +### Step 1: Add a “Send email” action + +1. Navigate to the **Events** tab. +2. Select an event trigger, such as **On click**. +3. Click the **+Add action** button and choose **Send Email** from the list. + +### Step 2: Configure your SMTP integration within the action + +You will be prompted to set up an SMTP integration to send emails. + +| Field | Description | +|-------------|-----------------------------------------------------------| +| SMTP Host | The SMTP server address, e.g., `smtp.gmail.com` | +| SMTP Port | Typically `587` for TLS or `465` for SSL | +| Use TLS | Enable if required (✅ recommended for Gmail, Outlook, etc.) | +| Username | Your full email address | +| Password | Your email password or an app-specific password (recommended) | + +> 💡 **Note for Gmail users:** You need to create an App Password and use it here instead of your regular email password. + +Once saved, this SMTP integration will be available for all future email actions. + +### Step 3: Compose your email + +Fill in the email details to customize your message: + +| Field | Description | +|------------|------------------------------------------------| +| To | Recipient’s email address | +| Subject | The subject line of your email | +| Message | Email body content (supports both plain text and HTML) | + +You can also configure additional fields such as *CC*, *BCC*, and select the *Body Type* as needed. + +Automate confirmations, alerts, and updates based on user interactions. + +![Send email event action][8] + +### Step 4: Add dynamic content (Optional) +Make your emails personal by including data from your forms or database: + +1. Click in any email field (To, Subject, or Message) +2. Use the data source picker to insert dynamic values +3. Examples: + - **To field**: Use form email input or user's email from database + - **Subject**: ""Thank you {{form_data.name}} for your submission"" + - **Message**: Include order details, user information, or form responses + +This ensures each email is customized for the recipient. + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/b31f7848-089d-44d8-a300-404d6d7bab80/Untitled.png + [2]: /user-docs/application-builder-button-element + [3]: /user-docs/application-builder-login-element + [4]: /user-docs/application-builder-form-element + [5]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/3c68c1dc-31f2-47f9-9723-bf06abe761d5/Untitled%201.png + [6]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/743f7e55-467f-4acf-b276-12bbeaab4df4/Untitled%202.png + [7]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/b07285b6-777b-44b2-86ad-4bbb4acfb0f5/Untitled%203.png + [8]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/820cea6d-8d59-485c-bbe4-db29bf3231a7/Send%20email.png",,baserow_user_docs,https://baserow.io/user-docs/element-events +176,Heading element,application-builder-heading-element,Baserow Application Builder heading element,"# Application Builder - Heading element + +A heading element defines the titles of sections within a [page](/user-docs/pages-in-the-application-builder). Heading elements help organize content and improve readability by providing structure to pages. + +In this section, we’ll set up a heading element, the configuration options, and how it generally works. + +## Overview + +Headings are important for structuring the page and guiding users through content on the page. They establish a hierarchy, making it easier to scan information. + +You can customize the [element properties and style of the heading](/user-docs/element-style) using the element settings panel on the right side of the screen. + +## Add and configure heading elements + +To add a heading element, click the `+` icon and select **Heading**. + +Place the heading wherever you want it on the [page][1]. Don't worry if it's not perfectly positioned initially; you can always move it later. + +Learn more about how to [add and remove an element from a page](/user-docs/add-and-remove-elements). + +![Add and configure table elements][2] + +Now, you can configure the heading's properties to make it function and look the way you want. This involves settings related to heading style. + +## Heading levels + +Baserow has several heading levels that can be customized according to your requirements. + +The heading levels, ranging from `

` to `

` , indicate different levels of importance and hierarchy. + +The `

` tag represents the highest level of importance, typically used for the main title of the page, while `

` represents the lowest level of importance. + +![Heading level][3] + +## Heading text + +The heading element has a text field to enter the heading text and that can be changed by clicking on it. + +You can enter static text here. However, if you've connected to a [data source](/user-docs/data-sources), all the fields from the [data source](/user-docs/data-sources) will also become available. Select a field from the data source to fetch data dynamically. + +![Heading text][4] + +## Horizontal alignment + +The horizontal alignment property controls how heading elements are positioned on the page. You can use it to achieve different visual arrangements for your headings. + +Here's a breakdown of the available alignment options: + +- **Left**: Aligns the heading to the left side of its container. +- **Center**: Aligns the heading in the center of its container. +- **Right**: Aligns the heading to the right side of its container. + +By adjusting the horizontal alignment property, you can create a more balanced and organized layout for the page. + +![Horizontal alignment][5] + +## Heading font color + +You can easily modify the font color of headings in the Application Builder. + +Navigate to the page where you can edit the heading you want to modify and select the heading element within the editor. Change the font color of a heading element using the Font property within a General tab. + +Click on the color picker or input field next to the font color option. + +Set the desired color of the heading using one of these methods: + +- **Hexadecimal color code:** Enter a six-digit code preceded by a hashtag (#), like #FF0000 for red. +- **RGB value:** Specify the red, green, and blue values (0-255) separated by commas, like RGB (255, 0, 0) for red. +- **Opacity:** Adjust the transparency of the chosen color using a value between 0 (fully transparent) and 1 (fully opaque). + +Use a visual color picker tool to interactively choose a desired color. + +Alternatively, you can inherit the default styles defined in the [theme settings](/user-docs/application-settings#theme) for a cohesive look. + +![Font color][6] + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account + + [1]: /user-docs/pages-in-the-application-builder + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/9b4430ab-5f8d-4261-acc1-72b100196f42/Untitled.png + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/39b1b36c-e6a0-41fd-a0e9-f54eb92de64b/Untitled%201.png + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/4175c5f4-4bf8-4e56-b09a-2ea6cb4b1c0b/Untitled%202.png + [5]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/a9550551-377a-4864-8926-ea52a7a94f65/Untitled%203.png + [6]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/7f313e5b-4142-4775-9a2a-f80377b609c4/Untitled%204.png",,baserow_user_docs,https://baserow.io/user-docs/application-builder-heading-element +177,Text element,application-builder-text-element,Text element in Baserow Application Builder,"# Application builder - Text element + +The text element is a versatile component that allows you to display information within the application. It provides a clean and simple way to present content. + +In this section, we'll guide you through the process of setting up a text element and explain each configuration option in detail. + +## Overview + +The Application Builders allow you to bind the text element to [data sources](/user-docs/data-sources). This enables the text to update dynamically based on user input or application logic. By binding the text element, any changes to the data source will be reflected in the displayed text, creating a responsive and dynamic user experience. + +For the text element, you can configure the element properties and [style](/user-docs/element-style) from the element settings. + +![Text element][1] + +## Add and configure text elements + +To add a text element, access the [elements panel](/user-docs/elements-overview) and select **Text**. + +Once added, place the text wherever you want it on the [page][2]. Don't worry if it's not perfectly positioned initially; you can always move it later. + +Learn more about how to [add and remove an element from a page](/user-docs/add-and-remove-elements). + +![Add and configure table elements][3] + +Once you've placed the text element on the editor, you can customize it to make it function and look the way you want. This involves settings related to text style. + +## Text element horizontal alignment + +You can horizontally align a text element using the horizontal alignment property. This will align the element on the page. + +This property offers several options to achieve the desired layout: + +- **Left:** Aligns the text to the left edge of the container. This is the default alignment for most text elements. +- **Right:** Aligns the text to the right edge of the container. +- **Center:** Positions the text horizontally in the center of the container. + +![Horizontal alignment][4] + +## Text format + +You can choose between the Plain text or Markdown format. + +Plain text is basic and universal, while Markdown offers more advanced formatting options. + +Markdown offers more advanced options for formatting text, like headings, bold, italics, and bulleted lists. + +You can use [Markdown](https://www.markdownguide.org/basic-syntax/) syntax in the text element, allowing you to format text with titles, paragraphs, links, images, etc. Once you're familiar with Markdown syntax, you can add structure to the text. + +![Text format markdown][5] + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/c52267ef-d70e-4b2a-92cd-a95e865c9a3e/Untitled.png + [2]: /user-docs/pages-in-the-application-builder + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/e3ed62f7-e34d-4ff4-9183-c691d3ceaff9/Untitled%201.png + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/d5fb0061-19dc-474a-a0c9-7a4923a4281f/Untitled%202.png + [5]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/160b2c77-327e-432c-a015-b809374005c2/Untitled%203.png",,baserow_user_docs,https://baserow.io/user-docs/application-builder-text-element +178,Link element,application-builder-link-element,Link element in Baserow Application Builder,"# Application Builder - Link element + +Links are essential for smooth navigation and user interactions in an app. They help users move between pages, start actions, or reach outside websites. + +We'll explore how to set up links well so they can connect to pages inside the app and to external sites. + +## Overview + +For the link element, you can configure the element properties, and [style](/user-docs/element-style) from the element settings. + +The Application Builder allows you to bind the text to [data sources](/user-docs/data-sources). This enables the text to update dynamically based on user input or application logic. + +## Add and configure link elements + +To add a link element, access the [elements panel](/user-docs/elements-overview) and select **Link**. + +Once added, place the link wherever you want it on the [page][1]. Don't worry if it's not perfectly positioned initially; you can always move it later. + +Learn more about how to [add and remove an element from a page](/user-docs/add-and-remove-elements). + +![Add and configure table elements][2] + +Now, you'll customize the link's behavior and appearance by configuring its properties. This includes options for linking to specific actions within the application. + +## Linking to pages + +The Application Builder allows you to create links that, when clicked, take users to a designated page within your application. + +You can control whether the linked page opens in the same browser tab (replacing the current content) or in a new tab altogether. Choosing the right option depends on your application's structure and user flow. Here's a quick guideline: + +- **Open in same tab**: When you click a link within a page, the new content replaces the current one in the same browser tab. This keeps your browsing experience focused on a single window. +- **Open in new tab**: Clicking a link within the page opens the linked content in a new browser tab. This allows you to keep the original content accessible while viewing the new one separately. + +![Baserow Link Open in...][3] + +## Navigate to a page + +This feature lets you link to a different page in the application. When you navigate to a page, you're moving to that place in the application where you can view content or do things. + +### Navigate to a path + +Navigating to a path is about moving to a specific location within the application, which is identified by its path in the application's structure. + +You need to first add a parameter via `:parameter` . [Path parameters](/user-docs/application-builder-page-settings#path-parameters) can be used to load data, depending on the provided parameter dynamically. + +The content will be generated automatically on that page depending on which specific detail the user has navigated to the detail page from. + +You can also do the same for a link type in the field configuration on a table element. + +### Navigate to a custom URL + +Navigating to a custom URL means going to a web address that is specifically designed or created for a particular purpose, often outside of the standard paths predefined by the application. + +To link to an external website, input the URL into the link field using the following format `https://www.example.com`. + +### View row details + +You can link to an internal page and set it to open a separate page within your Baserow application. For example, when the user clicks on a button, you want to display the row details. + +1. **Map row ID:** Ensure the row ID field in the [data source](/user-docs/data-sources) configuration is properly mapped. This will be used to identify the specific row when displaying details. + + > Determine the [data source](/user-docs/data-sources) that contains the information you want to show. This should be the same [data source](/user-docs/data-sources) that provides the details on the current page, or it could be a different one. + > +2. **Create a link:** + - Navigate to the element settings for the button or link you want to use to access the details page. + - Open the **General** tab. + - Locate the **Navigate to** dropdown menu. + - Select the dynamic page that displays the detailed information for a specific row. + +![Link row to a details page][4] + +That’s it. Now when the user clicks on a particular button, they will be taken to the page with the specific details. + +That’s it. Now when the user clicks on a particular button, they will be taken to the page with the specific details. + +## Link variant + +A link variant refers to the style or type of link used. + +When you select the Button variant, you can consider the design and user experience goals by choosing the button width. + +When it comes to the appearance of buttons, you have two options: ""auto"" and ""full width."" + +- **Auto width:** This means the button will adjust its width automatically based on the content inside. If the button text is short, the button will be narrower; if it's longer, the button will widen accordingly. +- **Full width:** Choosing this option means the button will stretch across the entire width of its container, regardless of the text inside. It provides a more expansive look and can be visually impactful. + +![Link to a details page][5] + +## Link horizontal alignment + +You can horizontally align a link element using the horizontal alignment property. This will align the link on the page. + +- **Center:** Aligns the link text in the middle of its container horizontally. +- **Left:** Aligns the link text to the left edge of its container. +- **Right:** Aligns the link text to the right edge of its container. + +## Link button color + +The color of a button refers to the visual appearance of the button itself. You can easily modify the link color in the Application Builder. + +Navigate to the page where you can edit the button you want to modify and select the link element within the editor. Change the color using the Button color property in a General tab. + +Click on the color picker or input field next to the color option. + +Set the desired color of the heading using one of these methods: + +- **Hexadecimal color code:** Enter a six-digit code preceded by a hashtag (#), like #FF0000 for red. +- **RGB value:** Specify the red, green, and blue values (0-255) separated by commas, like rgb(255, 0, 0) for red. +- **Opacity:** Adjust the transparency of the chosen color using a value between 0 (fully transparent) and 1 (fully opaque). + +Use a visual color picker tool to interactively choose a desired color. + +Alternatively, you can inherit the default styles defined in the [theme settings](/user-docs/application-settings#theme) for a cohesive look. + +![Link button color][6] + + + [1]: /user-docs/pages-in-the-application-builder + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/23b2f00d-e440-4629-9392-04e3d1b6fa7e/Untitled.png + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/06d32e8c-84dc-485e-a2ed-85497374accc/Untitled%201.png + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/7b858a00-baa9-437a-8e8c-3f3de8434434/Untitled%202.png + [5]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/b75c9700-e59c-4e5e-97ad-8c2434f908c4/Untitled%203.png + [6]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/9ecea232-7a25-4d26-943c-4d4d32294ce7/Untitled%204.png",,baserow_user_docs,https://baserow.io/user-docs/application-builder-link-element +179,Image element,application-builder-image-element,Baserow Application Builder image element,"# Application Builder - Image element + +Adding visual elements can greatly enhance user experience. In this section, we'll walk you through setting up a display image element and explain each configuration option in detail. + +## Overview + +For the image element, you can configure the element properties and [style](/user-docs/element-style) from the element settings. + +Setting up a display image element involves a few key configurations: + +- **Image file:** Choose the image you want to display via upload or URL. +- **Alt text:** This is a brief description of the image. +- **Alignment:** Position the image where you want it on the page – left, right, or center. +- **Image size:** Adjust the width and height of the image in pixels. You can choose specific dimensions or use a percentage to scale the image proportionally. + +![Baserow Application Builder - Image element][1] + +## Add and configure image elements + +To add an image element, access the [elements panel](/user-docs/elements-overview) and select **Image**. + +Once added, place the image wherever you want it on the [page][2]. Don't worry if it's not perfectly positioned initially; you can always move it later. + +Learn more about how to [add and remove an element from a page](/user-docs/add-and-remove-elements). + +![Add and configure table elements][3] + +Now that you've added the image, it's time to customize its appearance and functionality. This is where image properties come in, including those related to [style](/user-docs/element-style). + +## Image file + +When you want to add an image to a page, you have two options: uploading it directly from your device, or providing the web address (URL) where the image is stored online. + +### Upload from device + +Uploading works best for pictures you have or manage yourself. It's when you pick an image file from your computer, phone, or another device. + +To upload an image directly from your device, click the **Upload** button. This will open a file explorer window on your device. + +Locate the desired image file and select it. The Application Builder will then upload the image and make it available for use on the page. + +### By URL + +If the image you want to use is stored online, you can link to it instead of uploading it. Linking is preferable when the image is hosted elsewhere. + +- Click **URL**. +- Paste the complete web address (URL) of the image you want to display in this field. +- Ensure the image is publicly accessible online. The Application Builder will attempt to fetch the image from the provided URL and display it on the page. + +The Application Builder allows you to bind the URL to [data sources](/user-docs/data-sources). This enables the URL to update dynamically based on user input or application logic. This is helpful for referencing existing images stored elsewhere. + +## Image alt text + +Image alt text, which is short for ""alternative text,"" is important for accessibility and search engine optimization (SEO). + +An image alt text provides a textual description of the image for users who may not be able to see it. The alt text is displayed if the image fails to load properly in a web browser and read aloud by screen readers for the visually impaired, ensuring everyone can understand the image’s purpose. + +The Application Builder allows you to bind the text to [data sources](/user-docs/data-sources). This enables the text to update dynamically based on user input or application logic. + +## Image element horizontal alignment + +Horizontal alignment refers to placing an image to the left, center, or right side of its parent element, which can be the entire page or a specific section. + +- **Left:** The image will be positioned flush against the left edge of its container. +- **Center:** The image will be horizontally centered within its container. +- **Right:** The image will be positioned flush against the right edge of its container. + +![Horizontal alignment][4] + +## Control image size + +This helps you manage how images are displayed on the page. By setting the image size appropriately, you can ensure they fit seamlessly without appearing stretched or distorted. + +There are two options to control image size: + +- **Max width (percentage):** This determines the image's maximum width relative to its container. This ensures images don't overflow their container horizontally. +The percentage value must be between 0 and 100, to reflect the desired portion of the container's width the image should occupy. Percentages provide flexible layouts that adapt to different screen sizes. +- **Max height (pixels):** This defines the image's maximum height in pixels. This prevents large images from disrupting the layout. +The value must be between 5 and 3000 pixels to constrain the image's vertical dimension. Pixels provide a fixed value for specific height requirements. + +## Image constraint + +Constraining images ensures a consistent visual experience and prevents unintended layout issues. + +For image element, here are the constraints: + +- **Extend to max width**: This means the image will stretch horizontally as much as it can without distorting its height. It fills the available space from left to right. +- **Contain**: Contain means the image will fit entirely within its container. This option is unavailable while limiting the height of the image. If the image has a maximum height set, the image won't be able to adhere to it while containing. +- **Cover**: Cover means the image will expand or shrink to cover the entire container, maintaining its aspect ratio. This may result in parts of the image being cropped if it doesn't perfectly fit the container's dimensions. This option is unavailable when the max height is not set. + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/dd35bc3f-f94a-494d-a55d-4f2c0c4c45bf/Untitled.png + [2]: /user-docs/pages-in-the-application-builder + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/910666b3-25bb-48d3-80d6-dcfce5681e58/Untitled%201.png + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/354c98bb-cdac-4796-9134-aaf1e73859df/Untitled%202.png",,baserow_user_docs,https://baserow.io/user-docs/application-builder-image-element +180,Text input element,application-builder-text-input-element,Text input element in Baserow App Builder,"# Application Builder - Text input element + +The text input element allows users to enter text data in your application. + +This section will guide you through setting up a text input element and explain each configuration option in detail. + +![single-line input field][1] + +## Overview + +The text input element allows users to enter textual information. This is important for collecting various data types, including names, email addresses, URLs, and phone numbers. Text inputs are commonly used together with the [form element][2] to create user input forms. + +For the text input element, you can configure the element properties, and [customize its appearance](/user-docs/element-style) from the element settings. + +## Add and configure text input elements + +To add a text input element, access the [elements panel](/user-docs/elements-overview) and select **Text input**. + +Once added, place the text input wherever you want it on the [page](/user-docs/pages-in-the-application-builder). Don't worry if it's not perfectly positioned initially; you can always move it later. + +Learn more about how to [add and remove an element from a page](/user-docs/add-and-remove-elements). + +![Add and configure table elements][3] + +Now, you'll configure the text input's properties to make it function and look the way you want. + +## Text input properties + +The text input element has the following common settings: + +- **Label:** A descriptive label displayed above the field. +- **Default value:** The text pre-filled in the field when the application loads. +- **Placeholder:** Hint text displayed within the field when empty. +- **Required:** Determines if the user must enter a value. +- **Multiline:** Enables users to enter text across multiple lines. You can configure the number of lines displayed initially. + +The Application Builder allows you to bind the text to [data sources](/user-docs/data-sources). This enables the text to update dynamically based on user input or application logic. + +By customizing these style properties, you can create text inputs that match the look and feel of the page. + +## Multiline text input + +A multiline input field is used to create a field where users can input multiple lines of text. It differs from a single-line input field by allowing users to enter and edit text across multiple lines. + +Multiline inputs are commonly used for various purposes, such as user comments, message inputs, or any form field that requires the user to constrain text to paragraphs or longer descriptions. + +![Multiline input][4] + +Note: Even if you limit the number of displayed lines, users can still enter more text than what's visible. The scrollbar functionality will allow them to scroll and view/edit the entire content. + +Users can type or paste text within the text area, and they can navigate and edit the text using keyboard shortcuts and mouse clicks. + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/cb67f9e5-4ab3-4c88-b4f9-4dba8df4dca8/Untitled.png + [2]: /user-docs/application-builder-form-element + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/e832d8d9-5673-4ddc-8be4-f01b0edeef39/Untitled%201.png + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/0a0ea05b-9f3a-4d31-a52d-f7bc285021c0/Untitled%202.png",,baserow_user_docs,https://baserow.io/user-docs/application-builder-text-input-element +181,Columns element,application-builder-columns-element,Columns element in Baserow Application Builder,"# Application Builder - Columns element + +To make interfaces easy to use, you need a good layout plan. Using columns helps you arrange your page content well. + +Let's go over how to set up column containers. This will help your interface match your data just right. + +## Overview + +A column container serves as a foundational element in organizing your application. It allows you to arrange content for an intuitive user experience. With column containers, you gain the flexibility to structure and customize your layout. + +For the column element, you can configure the element properties and [style](/user-docs/element-style) from the element settings. + +## Add and configure column elements + +To add a column element, access the [elements panel](/user-docs/elements-overview) and select **Columns**. + +Once added, place the container wherever you want it on the [page](/user-docs/pages-in-the-application-builder). Don't worry if it's not perfectly positioned initially; you can always move it later. + +Learn more about how to [add and remove an element from a page](/user-docs/add-and-remove-elements). + +![Add and configure table elements][1] + +After defining the column layout for your application, you can customize its appearance and behavior by configuring the container's properties. + +## Column layout + +The layout option varies from 1-6 columns and allows you to determine the desired arrangement of elements within your interface. + +By specifying a number between 1 and 6, you define the structure and presentation of the page. This impacts how data is organized and displayed, influencing usability and visual appeal. + +![Baserow column Layout][2] + +## Space between columns + +The space between columns is adjustable, ensuring optimal spacing and visual clarity within your interface. + +This field's value must be less than or equal to 2000. + +![Space between columns][3] + +## Column vertical alignment + +The vertical alignment for your column container element can align content at the top, middle, or bottom of the container. + +- **Top alignment:** Selecting top alignment positions the content of the column container element at the top of the container. This is useful for situations where you want content to start from the top edge of the container. +- **Middle alignment:** Opting for middle alignment centers the content vertically within the column container element. It evenly distributes content, ensuring a balanced presentation. +- **Bottom alignment:** Choosing bottom alignment aligns the content at the bottom of the container element. This is for scenarios where you want content to end at the bottom edge of the container. + +![Column Vertical alignment][4] + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/e338a239-e015-4e96-bcec-f2c8da4cfc31/Untitled.png + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/82e294ec-5047-4f59-aa27-dc8c0906d67d/Untitled%201.png + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/85360cc8-c0ba-40af-ae0a-a3e482d8fb3e/Untitled%202.png + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/754cf382-747d-4cf9-bec9-2b57ae6589a6/Untitled%203.png",,baserow_user_docs,https://baserow.io/user-docs/application-builder-columns-element +182,Button element,application-builder-button-element,Button element in Baserow Application Builder,"# Application Builder - Button element + +Buttons are key for interaction in the Baserow Application Builder. They let users start actions. + +We'll show you how to set up a button and go over each setting option carefully. + +## Overview + +The Button element is like a trigger that lets users do something when they click it. It's a way to make things happen with a simple click, making actions easy and quick for users. + +For the button element, you can configure the element properties, [style](/user-docs/element-style), and [events](/user-docs/element-events) from the element settings. + +The Application Builder allows you to bind the text to [data sources](/user-docs/data-sources). This enables the text to update dynamically based on user input or application logic. + +## Add and configure button elements + +To add a button element, access the [elements panel](/user-docs/elements-overview) and select **Button**. + +Once added, place the button wherever you want it on the [page](/user-docs/pages-in-the-application-builder). Don't worry if it's not perfectly positioned initially; you can always move it later. + +Learn more about how to [add and remove an element from a page](/user-docs/add-and-remove-elements). + +![Add and configure button elements][1] + +Now, you'll configure the button's properties to make it function and look the way you want. This involves settings related to [button events](/user-docs/element-events), like what happens when it's clicked, and its [style](/user-docs/element-style). + +## Button horizontal alignment + +There are several ways to achieve horizontal alignment for your button element within the Application Builder. + +The horizontal alignment property controls how a button element is positioned within its container on the page. This helps you create a visually appealing and user-friendly page. + +- **Left:** Aligns the button to the left edge of its container. +- **Center:** Aligns the button horizontally in the center of its container. +- **Right:** Aligns the button to the right edge of its container. + +![Button Horizontal alignment][2] + +## Button width + +Consider your design and user experience goals when choosing the button width. + +When it comes to the appearance of buttons, you have two options: ""auto"" and ""full width."" + +- **Auto width:** This means the button will adjust its width automatically based on the content inside. If your button text is short, the button will be narrower; if it's longer, the button will widen accordingly. +- **Full width:** Choosing this option means the button will stretch across the entire width of its container, regardless of the text inside. It provides a more expansive look and can be visually impactful. + +![Button width][3] + +## Button color + +Before publishing the application button, consider styling the buttons. + +You can easily modify the color in the Application Builder. + +Learn more about [element style](/user-docs/element-style). + +Navigate to the page where you can edit the heading you want to modify and select the heading element within the editor. Change the color of a heading element using the property within a General tab. + +Click on the color picker or input field next to the color option. + +Set the desired color of the heading using one of these methods: + +- **Hexadecimal color code:** Enter a six-digit code preceded by a hashtag (#), like #FF0000 for red. +- **RGB value:** Specify the red, green, and blue values (0-255) separated by commas, like RGB (255, 0, 0) for red. +- **Opacity:** Adjust the transparency of the chosen color using a value between 0 (fully transparent) and 1 (fully opaque). + +Use a visual color picker tool to interactively choose a desired color. + +Alternatively, you can inherit the default styles defined in the [theme settings](/user-docs/application-settings#theme) for a cohesive look. + +![Button color][4] + +## Button events + +On the right side of the page, you'll find the **Events** tab. It has a dropdown menu where you can choose what the button will do when someone clicks on it. + +A button element can perform the following actions: + +- **Show notification**: This means it can display a message or alert to the user. +- **Open page**: Clicking the button can take the user to another page or website. +- **Create row**: It can add a new row of data. The action requires an integration to be used. +- **Update row**: This action allows modifying or editing existing data in a row. The action requires an integration to be used. + +Learn more about [element events](/user-docs/element-events). + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/fd21d4ec-5872-4d92-afba-d2d994adbbf5/Untitled.png + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/7bcd5bd2-6850-40ac-9da9-a1bc1fd9e438/Untitled%201.png + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/aadce328-9630-440e-8bf5-f47459ab979d/Untitled%202.png + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/a1669635-fa04-4ac9-854b-e67e6808a1fb/Untitled%203.png",,baserow_user_docs,https://baserow.io/user-docs/application-builder-button-element +183,Table element,application-builder-table-element,Table element in Baserow Application Builder,"# Application Builder - Table element + +The Table element works exactly like the grid view. It displays the data from the data source in a table layout. + +In this section, we'll guide you through the process of setting up a table element and explaining each configuration option in detail. + +## Overview + +For the table element, you can configure the element properties and [style](/user-docs/element-style) from the element settings. + +To get started, you need to connect a pre-configured [data source](/user-docs/data-sources) to fetch data from data sources and display it on the table. + +As soon as you add a table element to the page, the element settings will become available and you can start setting it up. + +![Baserow Application Builder table element][1] + +## Add and configure table elements + +To add a table element, access the [elements panel](/user-docs/elements-overview) and select **Table**. + +Once added, place the table wherever you want it on the [page](/user-docs/pages-in-the-application-builder). Don't worry if it's not perfectly positioned initially; you can always move it later. + +Learn more about how to [add and remove an element from a page](/user-docs/add-and-remove-elements). + +![Add and configure table elements][2] + +Now, you'll configure the table's properties to make it function and look the way you want. This involves settings related to table style. + +## Table data source + +> To list rows in the table, set the [data source](/user-docs/data-sources) service type as *List rows*. Learn more about data sources and how to configure them. +> + +After adding a table element to the page from **Elements**, you need to select the [data source](/user-docs/data-sources) which you want to import your data from. This is done from the **General** tab of the element settings. + +![Data source][3] + + +As soon as you select a **Data source**, you'll see the Fields configuration appear below. + +## Table items per page + +You can choose how many items appear in the list by default. The field must be an integer and must be less than or equal to 100. + +If there are more items to display than the defined number, a **Show More** button will be added at the end of the list, allowing the user to expand the list and view the additional items. + +## Table fields + +This is where you configure how the data will be mapped to a table to specify how exactly you want to display your data. + +You can configure some additional parameters for the table element and map the element fields to the data source to specify what data needs to be displayed and how. + +For each field, you can add a Name, Type, Value, and Link text. You can also configure the position of the fields. + +### Add a new field + +You can add new fields using the **Add field** button. After adding the field, you need to specify its Name, Type, Value, and Link text. + +Fields can have the following settings: + +- Name – a title for the column +- Type +- Value +- Link text +- Navigate to +- Parameter + +![Add a new field][4] + +### Field name + +Here you set the title of the field. The name of the field can be modified as needed. + +### Field type + +Choosing the appropriate field type ensures your table data is stored and displayed effectively. The table element supports the following field types: + + - **Text**: This is the most versatile type, suitable for any textual content, including names, descriptions, or short paragraphs. + - **Link**: Use this type to create clickable links within your table cells. When clicked, these links navigate users to external websites or internal pages within your application. + - **Boolean**: This type represents a true/false value. It's ideal for capturing binary data like ""Active/Inactive"" or ""Yes/No"" flags. + - **Tags**: This type allows users to assign labels or categories to table cells. Tags are commonly used for filtering, sorting, or grouping data based on these labels. + +### Field value + +If the Text type is selected, you can also set the value of the field. + +You can enter a specific value for the selected field so that the rows display that value. + +You can enter static text here. However, if you've connected to a [data source](/user-docs/data-sources), all the fields from the data source will also become available for your choice. + +![Enter value][5] + +### Field link text + +If the Link type is selected, you can also set the link text of the field. + +Similar to the text value, you can enter static text here. However, if you've connected to a [data source,](/user-docs/data-sources) all the fields from the data source will also become available for your choice. + +![Enter Link text][6] + +### Navigate to + +If the Link type is selected, you can also link to an internal page or custom URL through a button. + +![Navigate to][7] + +### Link row to a details page + +If the Link type is selected, you can link to an internal page through a button and set it to open a separate page within the Baserow application to view the details of a row. + +> In the detail page, you should link to the same data source that the table to which you want to connect the details is linked to. +> + +For example, let’s say you have a list of projects in a table. When the user clicks on the link associated with a specific project, you want to display this project’s details. + +You need to first add a parameter via `:parameter` . Path parameters can be used to load data, depending on the provided parameter dynamically. Then map the row ID in the data source configuration. + +![Link row to a details page][8] + +To link to a dynamic page, go to the element settings and open the General tab. From the **Navigate to** dropdown menu, set the detail page to which the table items are supposed to be linked. + +![ink to a dynamic page][9] + +That’s it. Now when the user clicks on a particular link associated with a row, they will be taken to the page with the details of the row. + +The content for each row will be generated automatically on that page depending on which row the user has navigated to the detail page from. + +You can also do the same for a Button element. + +### Delete a field + +![Delete a field][10] + +## Button color + +You can easily modify the color in the Application Builder. + +The color of a button refers to the visual appearance of the button itself. + +You can configure the color of the **Show more** button to show more items in the list. + +Navigate to the page where you can edit the heading you want to modify and select the heading element within the editor. Change the color of a heading element using the property within a General tab. + +Click on the color picker or input field next to the color option. + +Set the desired color of the heading using one of these methods: + +- **Hexadecimal color code:** Enter a six-digit code preceded by a hashtag (#), like #FF0000 for red. +- **RGB value:** Specify the red, green, and blue values (0-255) separated by commas, like RGB (255, 0, 0) for red. +- **Opacity:** Adjust the transparency of the chosen color using a value between 0 (fully transparent) and 1 (fully opaque). + +Use a visual color picker tool to interactively choose a desired color. + +Alternatively, you can inherit the default styles defined in the [theme settings](/user-docs/application-settings#theme) for a cohesive look. + +![Button color][11] + +## Sort fields + +You can manually reorder the fields with the drag-and-drop functionality. + +![Sort fields][12] + +## Table element orientation + +This setting controls how rows in the table element are arranged on the screen. You can define how the fields are displayed for different device types. This allows you to customize the layout for optimal viewing on various screen sizes. + +You can choose between two orientations: + + - Vertical: Fields will be stacked on top of each other. + - Horizontal: Fields will be displayed in rows from left to right. + +## User actions + +External users can filter, sort, and search within [published applications][13], creating a more interactive and user-friendly experience. + +For the table element, you can specify which fields to make filterable, sortable, and searchable for your external users. + +To add filtering, ordering, and searching capabilities, click on the table element and navigate to the right sidebar. There, you’ll see checkboxes to enable Filter, Sort, and Search for specific fields. + +![image: filter_order_and_search_for_published_applications][14] + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/f6b10d57-f288-46d9-b83e-ffdaf2c8fb79/Untitled.png + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/56fa9be7-100e-4b96-bf0e-c32000d89de2/Untitled%201.png + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/69f11760-4aee-4803-8a08-dc3196d65a73/Untitled%202.png + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/55181490-ee96-4b27-832c-f8408df90631/Untitled%203.png + [5]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/71fac19d-55d7-414e-9263-67e52c8222bf/Untitled%204.png + [6]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/8beb966d-9e74-4631-aef9-31ea1ba5c698/Untitled%205.png + [7]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/883b4278-e114-43aa-a9dc-9b85e0ece9c2/Untitled%206.png + [8]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/fd769e3e-d098-4157-95c7-5338cbd9b6c2/Untitled%207.png + [9]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/09d9e959-8e99-4a42-aa8c-bdf04e64eb0a/Untitled%208.png + [10]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/92c43c91-7342-4dd7-9fa4-8a3dd0353009/Untitled%209.png + [11]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/c4821c54-88e8-4003-8de5-c2de03937b25/Untitled%2010.png + [12]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/fa3d40c5-ac29-4b34-835c-005aa7240ce0/Untitled%2011.png + [13]: /user-docs/preview-and-publish-application + [14]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/1b4b3701-6795-404b-86ef-2cfa24391ec0/filter_order_and_search_for_published_applications.webp",,baserow_user_docs,https://baserow.io/user-docs/application-builder-table-element +184,Form element,application-builder-form-element,Form element in Baserow Application Builder,"# Application Builder - Form element + +Using the Form element, you can collect information from your users which you can store in a database, and configure events on submit. + +In this section, we'll guide you through the process of setting up a form element and explain each configuration option in detail. + +## Overview + +For the form element, you can configure the element properties, [style](/user-docs/element-style), and [events](/user-docs/element-events) from the element settings. + +The form layout is customizable and you can have any number of fields, specifying the type of each field. + +For example, if you have a job board, each job detail page can contain a form through which visitors can apply for that job. + +The Application Builder allows you to bind the text to [data sources](/user-docs/data-sources). This enables the text to update dynamically based on user input or application logic. + +![Form element][1] + +## Add and configure form elements + +To add a form element, access the [elements panel](/user-docs/elements-overview) and select **Form**. + +Once added, place the form wherever you want it on the [page](/user-docs/pages-in-the-application-builder). Don't worry if it's not perfectly positioned initially; you can always move it later. + +Learn more about how to [add and remove an element from a page](/user-docs/add-and-remove-elements). + +![Add and configure table elements][2] + +Now, you'll configure the form's properties to make it function and look the way you want. This involves settings related to form events (like what happens when it's clicked) and its style. + +## Form element types + +Now, let's see what element types are available: + +- **Text input** - an input field that requires the user to type in the value. +- **Dropdown** – a dropdown where users can choose from one of the predefined list of options. For the dropdown element, you will add all the available options**.** +- **Checkbox** - a checkbox field with a yes/no value. + +## Form submit button + +In the General tab, you customize the submit button and button color. + +You can enter static text as the *Submit button* value. However, if you've connected to a [data source](/user-docs/data-sources), all the fields from the data source will also become available for your choice. + +![Submit button][3] + +## Form button color + +You can easily modify the color in the Application Builder. + +Navigate to the page where you can edit the heading you want to modify and select the heading element within the editor. Change the color of a heading element using the property within a General tab. + +Click on the color picker or input field next to the color option. + +Set the desired color of the heading using one of these methods: + +- **Hexadecimal color code:** Enter a six-digit code preceded by a hashtag (#), like #FF0000 for red. +- **RGB value:** Specify the red, green, and blue values (0-255) separated by commas, like RGB (255, 0, 0) for red. +- **Opacity:** Adjust the transparency of the chosen color using a value between 0 (fully transparent) and 1 (fully opaque). + +Use a visual color picker tool to interactively choose a desired color. + +Alternatively, you can inherit the default styles defined in the [theme settings](/user-docs/application-settings#theme) for a cohesive look. + +![Button color][4] + +## Form events + +In the Events tab, you can set where it's going to be sent. To set the form's destination, you have the following options: + +- **Show notification**: This means it can display a message or alert to the user. +- **Open page**: Clicking the button can take the user to another page or website. +- **Create row**: It can add a new row of data. The action requires an integration to be used. +- **Update row**: This action allows modifying or editing existing data in a row. The action requires an integration to be used. + +Learn more about [element events](/user-docs/element-events). + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/2496bc41-709f-4530-bf3b-84fe5c31e922/Untitled.png + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/0fe1dc92-f78e-4945-908b-df6850671e85/Untitled%201.png + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/b6f3848b-538f-4261-9cb5-bf92dc33d03f/Untitled%202.png + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/33255c0e-ca8e-4350-9768-fb3bc70ef82d/Untitled%203.png",,baserow_user_docs,https://baserow.io/user-docs/application-builder-form-element +185,Choice element,application-builder-dropdown-element,Choice element in Baserow Application Builder,"# Application Builder - Choice element + +> We renamed the Dropdown element to the Choice element to better represent its new functionality, which includes displaying a list of radio buttons or checkboxes. + +The choice element lets users pick from a list of choices. It looks like a list that comes down when you click on it. + +In this section, we'll guide you through the process of setting up a choice element and explain each configuration option in detail. + +![Choice element for Application Builder][1] + +## Overview + +Choice elements are versatile components used for various purposes, including creating navigation menus and selecting options from a predefined list. They offer a user-friendly way to present choices without overwhelming the interface. + +> The Record Selector element enhances how users link and select related rows from other tables, making it especially useful for handling large datasets. Learn more about how to use the [Record Selector element][2]. + +You can configure the element properties and [style](/user-docs/element-style) from the element settings. + +The Application Builder allows you to bind the text to [data sources](/user-docs/data-sources). This enables the text to update dynamically based on user input or application logic. You can also populate the options with data retrieved from data sources. This offers a dynamic way to manage options. + +![Baserow choice element][3] + +## Add and configure choice elements + +To add a choice element, access the [elements panel](/user-docs/elements-overview) and select **Choice**. + +Once added, place the choice element wherever you want it on the [page](/user-docs/pages-in-the-application-builder). Don't worry if it's not perfectly positioned initially; you can always move it later. + +Learn more about how to [add and remove an element from a page](/user-docs/add-and-remove-elements). + +![Add and configure table elements][4] + +Now, you'll configure the choice element's properties to make it function and look the way you want. This involves settings related to choice element style. + +## Choice element configuration + +Choice elements are frequently used for navigation menus, or selecting options from a list. Users can choose from one of the predefined list of options you add. + +The choice element has the following settings: + + - **Label:** This is a clear and concise text displayed above the choice element. It acts as a description of the choice. + - **Default value:** This pre-selects an option from the list. If no default value is chosen, the first option is usually selected by default. + - **Placeholder:** This provides a hint to the user about what they should select when the choice is empty. + - **Required:** When enabled, users must choose an option from the list before continuing. This ensures they provide a necessary selection. + - **Allow multiple values**: This option determines whether the element allows users to select multiple choices. + - **Display**: This option controls how the element is displayed. You can choose between two options: + - **Dropdown**: This option presents a dropdown menu where users can select one or more options. + - **Checkboxes**: This option displays a list of checkboxes, allowing users to select multiple options by clicking on individual checkboxes. + - **Options:** These are the individual choices presented within the menu. Each option has two properties: + - **Value:** An internal identifier associated with the option. This value is typically used to store the user's selection in your application. + - **Name:** The text displayed to the user when presenting the options in the menu. Choose clear and concise names that accurately reflect the corresponding value. + +You can populate the options with data retrieved from data sources. + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/99a6fa85-1562-485a-a9d5-1b8833a9501e/Choice%20element%20for%20Application%20Builder%20.png + [2]: /user-docs/application-builder-record-selector-element + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/8edd4b78-a01b-4918-917f-4c286f7c92d6/Untitled.png + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/cb156340-d793-49aa-8cc7-c3cf224da962/Untitled%201.png",,baserow_user_docs,https://baserow.io/user-docs/application-builder-dropdown-element +186,Checkbox element,application-builder-checkbox-element,Checkbox element in Baserow Application Builder,"# Application Builder - Checkbox element + +The checkbox is a handy tool for users to quickly say yes with a tick or no by leaving it blank. + +Let's go over how to set up a checkbox and talk about each setting option. + +## Overview + +A checkbox is a little box you can check or leave empty. For the checkbox element, you can configure the element properties and [style](/user-docs/element-style) from the element settings. + +It's commonly used to give a choice between two options, typically 'true' or 'false.' When you check the box, it means 'true,' and when you leave it unchecked, it means 'false.' It's a way to select one or more options from a list by clicking on them. + +Learn more about the [boolean field in the Baserow table](/user-docs/boolean-field). + +The Application Builder allows you to bind the text to [data sources](/user-docs/data-sources). This enables the text to update dynamically based on user input or application logic. + +![Application Builder - Checkbox element][1] + +## Add and configure checkbox elements + +To add a checkbox element, access the [elements panel](/user-docs/elements-overview) and select **Checkbox**. + +Once added, place the checkbox wherever you want it on the [page](/user-docs/pages-in-the-application-builder). Don't worry if it's not perfectly positioned initially; you can always move it later. + +Learn more about how to [add and remove an element from a page](/user-docs/add-and-remove-elements). + +![Add and configure table elements][2] + +Now, you'll configure the checkbox's properties to make it function and look the way you want. This involves settings related to checkbox style. + +## Configure checkbox element + +When setting it up, you'll have some configuration options, like deciding what each choice represents or customizing its appearance. It's like tailoring the checkbox to fit your specific needs. + +The checkbox element has the following common settings: + +- **Label**: The label provides context for what the checkbox represents. This is the text that appears next to the checkbox, indicating what the checkbox is for. It should be clear and concise, explaining the purpose of selecting or deselecting the checkbox. +- **Default value**: The default value sets the initial state of the checkbox. This refers to the state of the checkbox when the form loads. For a yes/no checkbox, the default value could be either ""Yes"" (checked) or ""No"" (unchecked), depending on the context and the expected user behavior. +- **Required**: This option determines whether the user must interact with the checkbox before submitting the form. If the checkbox is required, the user must check yes before proceeding. If it's not required, the user can choose to leave the checkbox unchecked. + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/9b1b27c2-05c0-4cec-b863-afea7b4ee2b9/Untitled.png + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/4281431d-3a77-448c-b627-1a7426a088b6/Untitled%201.png",,baserow_user_docs,https://baserow.io/user-docs/application-builder-checkbox-element +187,iFrame element,application-builder-iframe-element,iFrame element in Baserow Application Builder,"# Application Builder - iFrame element + +The iFrame element allows you to insert custom snippets of code anywhere on your page. + +In this section, we will guide you through setting up an IFrame element and explain each configuration option in detail. + +## Overview + +An IFrame is an HTML element used to embed another document within the current HTML document. It allows you to display content from another source without the need for the user to navigate away from the current page. + +For the IFrame element, you can configure the element properties and [style](/user-docs/element-style) from the element settings. + +The Application Builder allows you to bind the text to [data sources](/user-docs/data-sources). This enables the text to update dynamically based on user input or application logic. + +## Add and configure IFrame elements + +To add an IFrame element, access the [elements panel](/user-docs/elements-overview) and select **IFrame**. + +Once added, place the IFrame wherever you want it on the [page](/user-docs/pages-in-the-application-builder). Don't worry if it's not perfectly positioned initially; you can always move it later. + +Learn more about how to [add and remove an element from a page](/user-docs/add-and-remove-elements). + +![Add and configure table elements][1] + +Now, you'll configure the IFrame's properties to make it function and look the way you want. This involves settings related to the IFrame style. + +That's it. Now the IFrame will appear. + +## IFrame source type + +Using IFrames can be handy for integrating content from other sources into your application seamlessly. + +You can set the source as a URL or an Embed. + +- **URL:** Input the link to the external resource to be embedded. Ensure that you have control over, or trust the URL entered. +- **Embed:** Input the raw HTML content to be embedded. + +For example, if you wanted to embed a map or form on a page, you could use an IFrame to display the map without redirecting the user to an external website. + +![Baserow form embed][2] + +## IFrame content + +You can enter static text here. However, if you've connected to a [data source](/user-docs/data-sources), all the fields from the data source will also become available. + +First, you need to get your embed code. + +To pass dynamic data, create a corresponding field in the pre-configured [data source](/user-docs/data-sources). You can create a [text field](/user-docs/single-line-text-field) in the table and add the embed code or create a [URL field](/user-docs/url-field) with the external link. + +Next, add an IFrame element to the page and link the field from the data source. + +![Baserow get your embed code. ][3] + +## IFrame height (px) + +The height of an IFrame element within an application can be specified in pixels (px). The maximum allowed height is 2000px. + +Here's an example of setting the iframe height to 500px: + +```json + +``` + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/e823613f-fb69-49b3-a8ee-866ded4c2d0b/Untitled.png + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/5bb39ca3-6ca6-40ae-897f-2c387a25d507/Untitled%201.png + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/cf1bd718-7203-480a-8f1c-f82c007b9dd4/Untitled%202.png",,baserow_user_docs,https://baserow.io/user-docs/application-builder-iframe-element +188,Login element,application-builder-login-element,Login element in Baserow Application Builder,"# Application Builder - Login element + +The login element allows users to access your application with secure credentials. + +Let's look at how to set up login functionality in your application using the login element. This element lets you build and handle user accounts right inside the Application Builder. + +## Overview + +The login element is an important component for securing your application. To enable user authentication, you'll need to choose a [user source](/user-docs/user-sources). This provides information needed to recognize and validate users attempting to log in. + +## Add and configure login elements + +To add a login element, access the [elements panel](/user-docs/elements-overview) and select **Login**. + +Once added, place the element wherever you want it on the [page](/user-docs/pages-in-the-application-builder). Don't worry if it's not perfectly positioned at first; you can always move it later. + +Learn more about how to [add and remove an element from a page](/user-docs/add-and-remove-elements). + +![Add and configure login elements][1] + +Now, you'll customize the login's behavior and appearance by configuring its properties. This involves settings related to login style. + +## Choose a user source to use the login element + +To configure the login element, you'll first need to choose the [source of your user data](/user-docs/user-sources). This determines where the application will verify user credentials during the login process.  + +The user source is essentially how your application identifies and verifies users. It establishes the foundation for secure login functionality. + +Adding a user source allows the application to recognize and authenticate users effectively. By adding a user source, you define how users will authenticate themselves within the application. This typically involves configuring settings related to username and password verification. + +Learn more about [how to add or configure a user source](/user-docs/user-sources). + +![Choose a user source to use the login element][2] + +Once you've chosen the user source, you can establish a secure connection and enable user authentication using the chosen method. + +## Using email and password for login + +Baserow's [password field type](/user-docs/password-field) provides a secure way to manage user credentials within your application. This functionality allows you to: + +- Set unique passwords for each user record. +- Store passwords securely within your Baserow database. +- Create new rows containing password data. + +By configuring a user source that leverages email and password login, users can authenticate themselves using their existing credentials. This streamlines the login process and enhances application security. + +Learn more about the [password field type](/user-docs/password-field). + +![Using email and password for login][3] + +## What happens after login? + +Once a user successfully logs in with a valid username and password, you can set the visibility of each element in your application according to a user's authentication status. + +![What happens after login in Baserow?][4] + +You can add a [logout action][5]. This can be set up as a [button element][6], with the 'On click' event configured to trigger a ‘Logout’. + +Clicking the logout button will end the user's session and return them to the login screen. + +![Baserow logout button will end the user's session ][7] + +## Troubleshooting + +**When a user successfully logs in, the next action after login is not initiated** + +The user may not have permissions to view the page that needs to be opened after login in. + +When you configure Page Visibility on a page, but the visitor doesn't have permissions to view that page, they will be automatically redirected to the login page. + +To fix this: + + - In the Page Editor, go to the page that the ""Open a Page"" action is pointing to. + + - Click Page Settings -> Visibility + + - Make sure that the visibility settings are correct. + - If the visitor's role is not included, make sure the visibility rules allow the visitor's role in the ""Allow roles..."" list. + - If the ""Allow roles"" doesn't have any roles to select, it means the user hasn't configured the User Roles correctly. + + - To configure User Roles, go to Application settings -> Users. + - Make sure a User Source exists + - Make sure the Role field is selected and that it is pointing to the correct database field. + + - Check that the page uses a valid data source. + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/4561f5d6-e1f6-4d3c-8103-7e23db516c6c/Untitled.png + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/c2d28ec6-d16b-49a4-9232-426d5b05c704/Untitled%201.png + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/e55f2618-ae71-4f52-b321-a7912069b0fd/Untitled%202.png + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/6979e3f0-c9f5-4ae5-9dc7-52e1b6bbfb8f/Untitled%203.png + [5]: /user-docs/element-events + [6]: /user-docs/application-builder-button-element + [7]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/8a1906dc-375a-4811-a222-6954cd75a7fe/logout.png",,baserow_user_docs,https://baserow.io/user-docs/application-builder-login-element +189,Element visibility,application-builder-element-visibility,Baserow Application Builder element visibility,"# Control element visibility in the Application Builder + +The visibility tab provides a powerful tool to control access to information and functionalities within your application. + +This article explains how to control who sees specific [elements][1] within your application using the visibility tab in the Application Builder. + +> Learn more about [page visibility][2] to control which user groups can see specific pages in your application. + +## Overview + +The visibility tab allows you to define which user groups can view specific elements in your application according to a [user's authentication status][3]. This is helpful for situations where you want to: + +- Restrict access to certain content for logged-in users only. +- Provide special information for visitors who haven't signed up yet. +- Control what everyone, regardless of login status, can see. + +You can set a different visibility level for each element in your application. This allows you to create a customized user experience based on login status. + +![Baserow Visibility tab and its location on the right-side panel][4] + +## How to use the visibility tab + +1. **Select an Element:** Click on the element in your application that you want to control visibility for. This could be a button, text, image, or any other element. +2. **Open the visibility tab:** Look for the right-side panel within the Application Builder. There should be a tab labeled ""Visibility"". +3. **Choose visibility level:** Within the Visibility tab, you'll see three options: + - **All visitors:** This option makes the element visible to everyone who visits your application, regardless of their login status. + - **[Logged-in visitors][5]:** This option restricts the element to users who have successfully logged in to your application. + - **Logged-out visitors:** This option makes the element visible only to users who haven't logged in yet. +4. **Set visibility:** Click on the desired option to define who can see the selected element. + +## Set visibility roles for logged-in visitors + +![Visibility roles for Application Builder ][6] + +Visibility roles provide a granular level of control over user access. By defining roles within your application and assigning them to users, you can determine which elements each user can see. + +Before using visibility roles, you'll need to establish the different user roles within your application. + + 1. [Create a field in the table][7] to store the assigned role for each user based on their permissions. + 2. In the Application Builder, navigate to your [User Source][3] settings. There, you'll define a role field. This field will be used to map user data in your [User Source][3] to the roles you established. or use the default role to assign appropriate roles to each user. + 3. Navigate to the element's Visibility tab within the editor. This allows you to define visibility based on user roles: + + - **All roles**: This option makes the element visible to all users, regardless of their role. + - **Allow roles**: Choose this option to define which specific user roles can see the element. Only users assigned to the selected roles will have access. + - **Disallow roles**: This option hides the element from users assigned to the selected roles. All other users will still see the element. + +This empowers you to create custom user experiences tailored to different user types. + +## Note: Visibility security + +> We're constantly enhancing the security features of the Application Builder. + +Elements that are hidden on the frontend are also secured on the backend so that data from those elements are never returned by the underlying API if the authenticated user does not have access. + +Here's how the data security works: + +1. If you create an element (like a table or form) that shows certain data from a data source, and make that element visible to a specific user role, then users with that role can access only that specific data they can see. +2. Similarly, if you create an action button that lets users update certain fields, they can only update exactly what that button is configured to change - nothing more. + +For example: + +- If you make a table element visible to the ""Sales"" role that shows customer names and order totals, users with the Sales role can only see those two pieces of information and nothing more and the API will only return the necessary data. +- If you add an ""Update Status"" button visible to ""Support"" role, they can only update the status field, even if they can see other fields. + +In a nutshell, securing the API is inherent to how you design your application — by controlling what data is available to users, you define what the API exposes. + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we’re ready to assist you. + + -   [Ask the Baserow community](https://community.baserow.io) + -   [Contact support](/contact) for questions about Baserow or help with your account. + + + [1]: /user-docs/elements-overview + [2]: /user-docs/application-builder-page-settings#page-visibility + [3]: /user-docs/user-sources + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/d809d3da-d097-446a-be89-ce891dfd8fe8/Baserow%20Visibility%20tab%20and%20its%20location%20on%20the%20right-side%20panel.png + [5]: /user-docs/application-builder-login-element + [6]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/d4df6672-9e82-4c87-ba65-0bf8d8b516a5/Visibility%20roles%20for%20Application%20Builder%20.png + [7]: /user-docs/adding-a-field",,baserow_user_docs,https://baserow.io/user-docs/application-builder-element-visibility +190,Paste data into cells,paste-data-into-baserow-table,Paste data into Baserow table cells,"# Paste data into table cells + +Baserow handles row creation automatically during paste operations; no configuration needed, just paste your data and watch new rows appear. + +Copy and paste data from spreadsheets directly into Baserow tables. Baserow automatically creates new rows when needed and fills multiple cells efficiently with smart paste behaviors. + + +## Overview + +Pasting data into Baserow works like spreadsheet applications, but with intelligent row creation. When you paste more rows than currently exist in your table, Baserow automatically creates the additional rows needed to accommodate your data. This built-in feature eliminates manual row creation, making bulk data entry fast and effortless, whether you're pasting from Excel, Google Sheets, or other sources. + +![Paste a single value into all selected cells][1] + +## How paste operations work + +Baserow intelligently handles different paste scenarios to match common spreadsheet workflows while respecting table structure and field types. + +### Automatic row creation + +When your paste data exceeds available rows, Baserow creates exactly the number of rows needed. If you paste 10 rows of data into a table with only 6 rows, Baserow adds 4 new rows automatically and fills them with your pasted values. This happens instantly without confirmation dialogs or manual intervention. + +### Single value to multiple cells + +Copy one cell and select multiple destination cells to paste the same value everywhere. For example, copy a cell containing ""Approved"" and select 20 empty cells; all 20 will display ""Approved"" after pasting. This is perfect for quickly filling default values, status updates, or any repeated information across multiple records. + +### Data overwriting behavior + +Pasting into cells that already contain data replaces existing values with pasted content. Baserow doesn't warn before overwriting; it assumes you intend to replace the data. Always verify your paste target before confirming to avoid accidental data loss. If you accidentally overwrite important data, use the immediate undo option (Ctrl/Cmd + Z) to restore original values. + + + +## Select cells and rows + +Row selection enables bulk editing, deletion, copying data across rows, or applying operations to multiple records simultaneously. Baserow supports multiple selection methods for different scenarios. + +### Individual cell selection + + - Click any cell to select it for editing or as a paste target. + - Click and drag across multiple cells to select ranges, extending your selection horizontally across fields or vertically down rows. + +Selected cells appear highlighted, showing exactly where your pasted data will land. + +### Row selection + + - Click row numbers on the left side to select entire rows, which highlights all cells in that row across all visible fields. + - Hold Shift and click another row number to select everything between your first and last selection. + - Hold Ctrl (Windows) or Cmd (Mac) and click individual row numbers to select multiple non-adjacent rows. + +> **Selection limit:** Baserow allows selecting up to 200 rows at once due to lazy loading, which loads data progressively as you scroll rather than loading entire tables. This limitation enables smooth performance with tables containing millions of rows. + +### Multi-cell selection for pasting + +Click and drag to select rectangular areas of cells when you want to paste data into specific field ranges. + +Your selection rectangle must match the dimensions of your copied data for proper alignment. If you're pasting 3 columns by 5 rows, select a 3×5 cell area as your target. + + +## Step-by-step paste process + +Follow these steps for reliable paste operations that work consistently across different data sources. + +### Basic paste operation + +1. **Copy your source data** from Excel, Google Sheets, or another Baserow table using Ctrl/Cmd + C +2. **Click your target cell** in Baserow where you want the pasted data to begin +3. **Paste using Ctrl/Cmd + V** (or right-click and select ""Paste"") +4. **Watch Baserow create rows automatically** if your paste data exceeds available rows +5. **Verify the results** to ensure data aligned correctly with your intended fields + +![Pasting data to create new rows automatically](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/48479958-51a3-4f56-b5d9-e20fa14f629b/Paste%20data.webp) + +### Copying within Baserow + +Move or duplicate data between rows in the same table or across different tables in your workspace. Select the cells you want to copy, use Ctrl/Cmd + C to copy, then navigate to your destination and paste with Ctrl/Cmd + V. This works within the same table, between tables in the same database, or across different databases in your workspace. + +![Moving rows using copy-and-paste functions](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/c4e458d6-32fa-404a-b35a-e9f1df26d1af/Moving%20rows%20using%20copy-and-paste%20functions.webp) + + + +## Field type considerations + +Understanding how different field types handle pasted data helps prevent unexpected results and ensures clean imports. Verify field types before pasting. Check that your source data format matches the destination field types. + +### Compatible field types + +- Text pasted into text fields works universally; single-line text and long text fields accept any pasted content. +- Numbers must be numeric characters to paste successfully into number fields; text strings are rejected. +- Dates require proper date formatting (ISO format like 2024-03-15, works best). +- Boolean fields accept variations of true/false, yes/no, or 1/0. + +### Special field handling + +Single select and multiple select fields accept pasted values that match existing options exactly. If you paste ""Pending"" into a status field with options ""Pending,"" ""Approved,"" and ""Rejected,"" it works perfectly. However, pasting ""pending"" (lowercase) creates a mismatch unless you have that exact option. + +### Paste failures + +When pasted data doesn't match field type expectations, those cells remain empty rather than showing error messages. If you paste ""abc"" into a number field, the cell stays blank. + +Review your paste results immediately to catch these mismatches and correct them before continuing work. + +Learn more: [Field types overview](/user-docs/baserow-field-overview) + + + + + + + +## Frequently asked questions + +### Can I paste data with more columns than my table has? + +No, paste operations only work within existing fields. If your copied data has 10 columns but your table only has 7 fields, only the first 7 columns are pasted. The remaining 3 columns are ignored. Add necessary fields to your table before pasting if you need to accommodate all columns. + +### What happens if I paste data that doesn't match field types? + +Cells where data doesn't match field type requirements remain empty after pasting. For example, pasting text into number fields leaves those cells blank. Baserow doesn't show error messages for individual cell failures; you need to manually review results and correct mismatches. + +### Can I paste formatted text with bold or italics? + +No, Baserow pastes plain text only. Rich text formatting, like bold, italics, colors, or font sizes from source applications, is stripped during paste. Only the actual text content transfers to Baserow cells. + +### How do I know if Baserow created new rows automatically? + +Watch your table during paste operations; new rows appear immediately at the bottom as Baserow creates them. The row count in your view increases, and you'll see your pasted data filling the newly created rows. Scroll down after pasting to verify all data transferred correctly. + +### Can I paste data into filtered views? + +Yes, but paste operations work differently in filtered views. New rows created through paste appear in your filtered view if they meet filter criteria, but rows that don't match filters are hidden after creation. They still exist in the table; remove filters to see all pasted data. + + + +## Related content + +**Import alternatives:** +- **[Import into existing tables](/user-docs/import-data-into-an-existing-table)** – Upload CSV or Excel files for larger datasets +- **[Create rows manually](/user-docs/how-to-make-new-rows)** – Add individual records one at a time + +**Selection and editing:** +- **[Row overview](/user-docs/overview-of-rows)** – Understand row structure and operations +- **[Keyboard shortcuts](/user-docs/baserow-keyboard-shortcuts)** – Faster navigation and operations + +**Data management:** +- **[Field types](/user-docs/baserow-field-overview)** – Understand what data each field accepts +- **[Filter rows](/user-docs/filters-in-baserow)** – Work with specific data subsets + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account. + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/e83fb1b4-6547-437d-8652-d723fd83b35b/Paste%20a%20single%20value%20into%20all%20selected%20cells.jpg",,baserow_user_docs,https://baserow.io/user-docs/paste-data-into-baserow-table +191,AI prompt field,ai-field,AI prompt field in Baserow table,"# AI prompt field in Baserow + +The AI prompt field lets you generate text, summaries, classifications, and insights directly in your Baserow tables using dynamic prompts that reference other fields. It supports [multiple AI providers][1] and can process documents (PDF, DOCX, TXT, MD) for automated analysis. + +> The AI prompt field is available on Premium plans and higher. [Upgrade your subscription](https://baserow.io/pricing) to access this feature. + +## Overview + +The AI prompt field transforms your Baserow tables into intelligent automation engines. Reference data from [other fields][2] to create dynamic prompts, classify content, summarize documents, or generate creative text, all without leaving your database. Each cell includes a generate button that processes your prompt on demand. + +## How it works + +AI prompt fields use large language models to process prompts you create. These prompts can reference other fields in your table, making responses contextual and dynamic. Configure the model, temperature, and output format, then click generate in any row to produce AI-powered results. + +**Common use cases:** + - Summarize customer feedback from long text fields + - Classify support tickets by urgency or category + - Generate product descriptions from specifications + - Extract key information from uploaded documents + - Create personalized email drafts based on customer data + +![AI prompt field configuration interface][3] + +## Before you begin + +Ensure AI is configured in your workspace: +1. Check that [generative AI is configured](https://baserow.io/user-docs/configure-generative-ai) at workspace or instance level +2. [Verify your plan][4] includes AI prompt field access (Premium or higher) +3. Have your source data ready in other table fields + +## Create an AI prompt field + +### Basic setup + +1. Click **+ Add a field** in your table +2. Select **AI prompt** from the field type options +3. Name your field (e.g., ""Summary"", ""Classification"", ""Generated Description"") + +### Configure AI settings + +| Setting | Purpose | +|---------|---------| +| **AI type & model** | Choose provider (Baserow, OpenAI, Anthropic, etc.) and specific model. GPT-3.5 for speed, GPT-4 for quality | +| **Temperature** | Control creativity (0-2). 0-0.3 for factual, 0.7-1.0 for creative | +| **File field** | The first compatible file in the field | +| **Output type** | Format the response. ""Text"" for open-ended, ""Choices"" for classification | + +### Build your prompt + +1. Click the **Prompt** field in the configuration panel +2. Write your instruction (e.g., ""Summarize the following customer feedback:"") +3. Reference other fields by selecting from the list +4. Example prompt: `Classify this review as Positive, Neutral, or Negative: {Fields > Income 2025}` +5. Click **Create** + +### Generate results + +Each row now displays a **Generate** button in the AI prompt field. Click it to process the prompt using that row's data. Results appear in the cell once generation completes. + +![AI prompt field with generate button][5] + +## Use AI with file fields + +### Supported file formats + +The AI prompt field can analyze text-based documents directly: + +| Format | Extension | Common Use | +|--------|-----------|------------| +| Plain text | `.txt` | Notes, logs, transcripts | +| Markdown | `.md` | Documentation, articles | +| PDF | `.pdf` | Invoices, reports, contracts | +| Word | `.docx` | Documents, proposals | + +### Setup file analysis + +1. Create or identify a [file field](/user-docs/file-field) containing your documents +2. In the AI prompt field configuration, connect to that file field +3. Write a prompt that instructs processing (e.g., ""Extract the invoice total and date from this document"") +4. The AI uses the first compatible file in the row as context + +**Example workflow:** +- Upload invoice PDFs to a file field +- Create AI prompt field with prompt: ""Extract: Invoice Number, Date, Total Amount, Vendor Name"" +- Click generate to automatically extract structured data + +![File field support for AI analysis][6] + +## Output types explained + +### Text output +Returns free-form AI-generated text. Best for summaries, descriptions, or creative content where responses vary widely. + +**Example:** ""Write a professional email response to this customer inquiry: {Support Ticket}"" + +### Choices output +Constrains AI to select from predefined options. Ideal for classification, categorization, or structured responses. + +**Setup:** +1. Select ""Choices"" as output type +2. Define your options (e.g., ""Positive, Neutral, Negative"") +3. Prompt: ""Classify the sentiment: `Fields > Review Text`"" + +The AI will return only one of your specified choices, ensuring consistent categorization. + +## Temperature settings guide + +Temperature controls response randomness: + +| Range | Behavior | Best For | +|-------|----------|----------| +| **0 - 0.3** | Focused, deterministic | Factual summaries, data extraction, classification | +| **0.4 - 0.6** | Balanced | General business writing, Q&A | +| **0.7 - 1.0** | Creative, varied | Marketing copy, brainstorming, creative content | +| **1.1 - 2.0** | Highly experimental | Rarely recommended; very unpredictable | + +**Pro tip:** Start at 0.5 and adjust based on results. Lower if responses are too random, raise if they're too repetitive. + + +## Troubleshooting + +**The self-hosted version of Baserow has no AI prompt** + +You need to [configure the AI prompt field][7] to enable it in self-hosted instances. The settings you need can be found in the [developer documentation][7]. + +For example, to configure the AI field with OpenAI, you need to set `BASEROW_OPENAI_API_KEY` and `BASEROW_OPENAI_MODELS` + + +## Frequently asked questions + +### What AI models can I use with AI prompt fields? + +Available models depend on your [generative AI configuration](/user-docs/configure-generative-ai). Self-hosted users can configure OpenAI, Anthropic, Ollama, OpenRouter or Mistral models. + +### Do AI prompt fields update automatically when source fields change? + +No. AI prompt fields generate on demand when you click the generate button. This prevents unnecessary API calls and gives you control over when processing occurs. + +### How much does it cost to use AI prompt fields? + +Baserow Premium plans include AI prompt field usage. Monitor your usage through your provider's dashboard. + +### Can I reference multiple fields in one prompt? + +Yes. Reference unlimited fields and select from your table's fields. Example: `Compare {Fields > Product A} and {Fields > Product B} and explain which is better for {Fields > Use Case}`. + +### What happens if file analysis fails? + +Common causes include unsupported file formats, corrupted files, or files exceeding the model's token limit. Ensure files are in supported formats (.txt, .md, .pdf, .docx) and under 10MB. Check error messages in the cell for specific guidance. + +### Can I bulk-generate results for multiple rows? + +Currently, AI prompt fields require manual generation per row. For batch processing, click generate on each row sequentially, or use the [Baserow API](https://baserow.io/user-docs/database-api) to automate generation via scripts. + +## Related documentation + + - [Configure generative AI](/user-docs/configure-generative-ai) - Set up AI providers and models + - [Generate formulas with Baserow AI](/user-docs/generate-formulas-with-baserow-ai) - Use AI to create formulas + - [File field](/user-docs/file-field) - Upload and manage documents + - [Formula field](/user-docs/formula-field-overview) - Alternative for calculated fields + - [Single select field](/user-docs/single-select-field) - Manual classification alternative + - [Long text field](/user-docs/long-text-field) - Store source text for AI processing + - [Premium pricing plans](/user-docs/pricing-plans) - Upgrade for AI prompt field access + +## Tutorials + - [How to enable and configure the AI field in Baserow][8] + - [How to transform data into actionable insights with Baserow AI][9] + - [How to use Baserow AI to analyze documents][10] + +--- + +**Need help?** Visit the [Baserow community](https://community.baserow.io/) or [contact support](/contact) for assistance with your account. + + + [1]: https://baserow.io/user-docs/generative-ai-baserow + [2]: https://baserow.io/user-docs/baserow-field-overview + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/11dc38d8-051a-481a-86b1-38f3c0c7484f/ai_field_improvements.webp + [4]: https://baserow.io/user-docs/subscriptions-overview + [5]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/e34d40cf-315a-4c21-8a76-81432c96fc41/AI%20Field.png + [6]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/e9472557-303b-4107-a77e-bc14a622b0d7/File%20field%20support%20for%20the%20AI%20field.png + [7]: https://baserow.io/docs/installation/configuration + [8]: https://baserow.io/blog/configure-ai-field-in-baserow + [9]: https://baserow.io/blog/transform-data-into-insights-with-baserow-ai + [10]: https://baserow.io/blog/use-baserow-ai-analyze-documents",,baserow_user_docs,https://baserow.io/user-docs/ai-field +192,Repeat element,application-builder-repeat-element,Repeat element in Baserow Application Builder,"# Application Builder - Repeat element + +A repeat element allows you to show a list within a [page](/user-docs/pages-in-the-application-builder) by repeating the elements for each result in the data source. It allows you to repeat a set layout for each item in a container, making it easier to manage large amounts of similar data. + +In this section, we’ll set up a repeat element, the configuration options, and how it generally works. + + + +## Overview + +Repeat elements allow you to display lists or collections of data. Instead of manually creating multiple instances of similar elements, repeat elements can dynamically generate as many instances as needed based on the data source. + +Using repeat elements ensures consistency across the application. When you update the design or functionality of a repeat element, the changes are automatically applied to all instances. This makes maintenance easier and reduces the risk of inconsistencies. + +You can customize the [element properties and style of the element](/user-docs/element-style) using the element settings panel on the right side of the screen. + +## Hierarchy using the Repeat element + +You can create two types of hierarchies using the Repeat element: + + - **Root-level collection element**: This type of element is associated with a multiple-row [data source][1] but does not have a multiple-valued property. It allows you to create a primary collection that can iterate over data rows. + - **Nested collection element**: This type of element does not require a [data source][1] but instead uses a multiple-valued property. It is embedded within another collection element, allowing you to display a hierarchy, such as a list of departments with each containing a nested list of employees or categories with nested products for an e-commerce store. + +![Hierarchy using the Repeat element][2] + +## Add and configure repeat elements + +To add a repeat element, click the `+` icon and select **Repeat**. + +Place the element wherever you want it on the [page][3]. Don't worry if it's not perfectly positioned initially; you can always move it later. + +Learn more about how to [add and remove an element from a page](/user-docs/add-and-remove-elements). + +Now, you can configure the element's properties to make it function and look the way you want. This involves settings related to repeat style and [adding child elements][4] to the repeat element. + +![Baserow app builder repeat element][5] + +## Repeat data source + +> To list rows in the repeat list, set the [data source](/user-docs/data-sources) service type as *List multiple rows*. Learn more about data sources and how to configure them. +> + +After adding a repeat element to the page from **Elements**, you need to select the [data source](/user-docs/data-sources) which you want to import your data from. This is done from the **General** tab of the element settings. + +![Repeat element screenshot][6] + +## Repeat items per page + +You can choose how many items appear in the list by default. The field must be an integer and must be less than or equal to 100. + +If there are more items to display than the defined number, a **Show more** button will be added at the end of the list, allowing the user to expand the list and view the additional items. + +## Repeat element orientation + +This setting controls how repeated elements are arranged on the screen. You can choose between two orientations: + +* **Vertical:** Elements will be stacked on top of each other. +* **Horizontal:** Elements will be displayed in rows from left to right. + +When choosing horizontal orientation, you can further define the number of elements displayed per row for different device types. This allows you to customize the layout for optimal viewing on various screen sizes. + +**Properties of items per row:** + +* **Per device type:** You can set a different number of items per row for each device type (e.g., mobile, tablet, desktop). +* **Integer value:** The number of items must be a whole number (1, 2, 3, etc.). +* **Range:** The number of items must be between 1 and 10 (inclusive). + +![Repeat element horizontal screenshot][7] + +## User actions + +External users can filter, sort, and search within [published applications][8], creating a more interactive and user-friendly experience. + +For the repeat element, you can specify which fields to make filterable, sortable, and searchable for your external users. + +To add filtering, ordering, and searching capabilities, click on the repeat element and navigate to the right sidebar. There, you’ll see checkboxes to enable Filter, Sort, and Search for specific fields. + +![image: filter_order_and_search_for_published_applications][9] + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: /user-docs/data-sources + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/6479b9ca-d9ce-4523-a2b2-cedada4ca1ba/nested_collection_elements.webp + [3]: /user-docs/pages-in-the-application-builder + [4]: /user-docs/add-and-remove-elements + [5]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/0ee7d1fb-09f2-45c5-a6db-f58326dfb831/Application%20Builder%20-%20Repeat%20element%20.png + [6]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/0f4b9ce7-c200-4e69-ba10-cf92bc4bef49/Repeat%20element.png + [7]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/4f372355-aae8-4044-b3cc-1097d0c2ee44/Repeat%20element%20-%20vertical.png + [8]: /user-docs/preview-and-publish-application + [9]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/40f9ce8a-e81b-4740-a3b0-b7bbc635a37d/filter_order_and_search_for_published_applications.webp",,baserow_user_docs,https://baserow.io/user-docs/application-builder-repeat-element +193,AI formula generator,generate-formulas-with-baserow-ai,Generate formulas with AI in Baserow,"# Generate formulas with Baserow AI + +Baserow's AI formula generator converts plain English descriptions into working formulas instantly. Describe what you want to calculate, and AI creates the formula syntax for you. + +> AI formula generation is available on Premium plans and higher. [Upgrade your subscription](https://baserow.io/pricing) to access this feature. + +## Overview + +Writing formulas traditionally requires understanding function syntax, field references, and logical operators. Baserow AI eliminates this learning curve by translating natural language instructions into functional formulas. Describe your calculation in plain English, and AI generates the formula syntax. + +**Save time on:** +- Complex date and time calculations +- Conditional logic and nested IF statements +- Multi-field mathematical operations +- Text manipulation and concatenation +- Budget and financial calculations + +Learn more about [writing effective prompts][1]. + +## How it works + +The AI formula generator uses large language models to interpret your description and generate Baserow formula syntax. It understands your table structure, field names, and available functions, then produces formulas you can review and implement immediately. + +![AI formula generator interface][2] + +## Prerequisites: + +1. [Generative AI configured](/user-docs/configure-generative-ai) in your workspace +2. Premium plan or higher +3. Existing table with fields you want to reference +4. Clear understanding of your desired calculation + +> Have your field names ready. The more specific your prompt, the better the generated formula. + +## Generate a formula with AI + +### Step 1: Create a formula field + +1. Open your table +2. Click **+ Add a field** +3. Select **Formula** from field type options +4. Name your field (e.g., ""Status"", ""Discount Price"", ""Days Until"") + +### Step 2: Access the AI generator + +1. In the formula editor modal, locate **Generate using AI** +2. Click to open the AI generation panel +3. The panel shows your available fields and AI model selector + +### Step 3: Choose your AI model + +Select the AI type, model and temperature. [Configure generative AI](/user-docs/configure-generative-ai) - Set up AI providers. + +### Step 4: Write your prompt + +**Prompt best practices:** + +✅ **Be specific:** ""Calculate discount price: 10% off if quantity > 50, 20% off if > 100"" +❌ **Too vague:** ""Give me a discount"" + +✅ **Reference field names:** ""Use the Due Date and Priority fields"" +❌ **Generic terms:** ""Use the date column"" + +✅ **Specify output format:** ""Show result as percentage with 2 decimals"" +❌ **Unclear format:** ""Show as percent"" + +✅ **Include edge cases:** ""If Price is blank, show 0"" +❌ **Ignore edge cases:** Doesn't mention blank values + +**Example prompts:** +- ""Calculate tax: multiply Price by 0.2, but only if Taxable is checked"" +- ""Count days between Start Date and End Date, excluding weekends"" +- ""Show 'High' if Score is over 80, 'Medium' if 50-80, 'Low' if under 50"" +- ""Join Address Line 1, City, and Postal Code with commas between them"" + +### Step 5: Generate and review + +1. Click **Generate** +2. Wait 2-10 seconds for AI to process +3. Review the generated formula in the preview +4. Check that field references are correct +5. Verify the logic matches your intent + +### Step 6: Test and refine + +1. Click **Create field** if formula looks correct +2. Check results in a few table rows +3. If results are incorrect: + - Return to formula editor + - Click **Generate using AI** again + - Refine your prompt with more details + - Regenerate + +## Troubleshooting + +### Formula doesn't match my intent + +**Problem:** AI generated a formula, but it doesn't do what you wanted. + +**Solutions:** +- Add more detail to your prompt +- Explicitly mention edge cases (""if field is empty, show 0"") +- Reference exact field names in quotes +- Break complex requests into simpler parts +- Try a different AI model + +### Generated formula shows an error + +**Problem:** Formula has red error text or won't save. + +**Solutions:** +- Check that all referenced fields exist in your table +- Verify field names match exactly +- Try regenerating with a clearer prompt +- Review [formula field reference](/user-docs/understanding-formulas) for syntax rules +- Contact support if the error persists + +### AI doesn't understand my field names + +**Problem:** Formula references wrong fields or generic terms. + +**Solutions:** +- Use exact field names in your prompt: ""Use field called 'Order Total', not 'Total Amount'"" +- Put field names in quotes in your prompt +- Simplify field names if they're ambiguous +- Describe field purpose: ""the 'Status' field contains values like 'Active' or 'Inactive'"" + +### Results are inconsistent across rows + +**Problem:** Formula works for some rows but fails for others. + +**Solutions:** +- Check for blank fields in failing rows +- Add null handling: ""If Due Date is blank, show 'Not Set'"" +- Test with diverse row data +- Review formula for unhandled conditional branches + +### Can't access AI generation + +**Problem:** ""Generate using AI"" button is missing or disabled. + +**Solutions:** +- Verify you're on the Premium plan or higher +- Confirm [AI is configured](/user-docs/configure-generative-ai) and check workspace permissions +- Try refreshing your browser + +## Frequently asked questions + +### Does the AI remember my previous formulas? + +No. Each generation is independent. The AI doesn't learn from or reference your previous formulas. Save successful prompts externally if you want to reuse similar patterns. + +### Can AI generate formulas using custom functions? + +AI generates formulas using Baserow's [standard formula functions](/user-docs/understanding-formulas). It doesn't create custom functions but can combine existing functions in sophisticated ways. + +### How accurate is the AI formula generator? + +Accuracy depends on prompt clarity and formula complexity. Simple calculations have ~95% success rate. Complex nested logic may require refinement. Always test generated formulas before relying on them. + +### Can I edit formulas after AI generates them? + +Yes. Click into the formula field to manually edit the generated formula. This is useful for minor adjustments without regenerating entirely. + +### What happens if my table structure changes? + +Formulas reference fields by name. If you rename a field, formulas break. Update field references manually or regenerate the formula with the new field name. + +### Is there a limit to formula complexity? + +AI can generate complex formulas, but Baserow has a formula length limit. Extremely long formulas may need to be split across multiple fields. If generation fails, simplify your request. + +## Related documentation + + - [Introduction to formulas in Baserow](/user-docs/formula-field-overview) - Formula basics and concepts + - [Formula field reference](/user-docs/understanding-formulas) - Complete function documentation + - [Configure generative AI](/user-docs/configure-generative-ai) - Set up AI providers + - [AI field](/user-docs/ai-field) - Generate text content with AI + - [Number field](/user-docs/number-field) - Alternative for simple calculations + - [Date and time fields](/user-docs/date-and-time-fields) - Date field options + - [Premium pricing plans](https://baserow.io/pricing) - Upgrade for AI features + +## Tutorials + + - [How to use AI to generate formulas in Baserow][3] + - [How to apply discounts dynamically with formulas][4] + +--- + +**Need help?** Visit the [Baserow community](https://community.baserow.io) or [contact support](/contact) for assistance with your account. + + + [1]: https://baserow.io/user-docs/ai-prompt-guide + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/d4d75565-b60f-48ca-81d2-197ea7c91fde/generate%20formulas%20with%20AI.png + [3]: https://baserow.io/blog/use-ai-generate-formulas-baserow + [4]: https://baserow.io/blog/apply-discounts-dynamically-with-baserow-formulas",,baserow_user_docs,https://baserow.io/user-docs/generate-formulas-with-baserow-ai +194,OttoKit,suretriggers-integration,Integrate Baserow with OttoKit (formerly SureTriggers),"# Configure Baserow in OttoKit (formerly SureTriggers) + +OttoKit offers the ability to create custom workflows that perform actions in response to specific triggers. You can seamlessly sync data from Baserow to over 600 apps using various triggers. + +With OttoKit, you can connect Baserow to multiple apps and services, automating repetitive tasks without coding and creating custom automation that executes specific actions based on particular events. + +![OttoKit with Baserow][1] + +## What is the Baserow OttoKit integration? + +OttoKit is an automation platform that connects Baserow with hundreds of popular apps and services. This integration enables you to create automated workflows that trigger actions based on changes in your Baserow databases. + +With this integration, you can: + + - Automatically sync data between Baserow and other apps + - Trigger notifications when database changes occur + - Create multi-step workflows that save hours of manual work + - Build complex automations without writing any code + +## Prerequisites + + - A [Baserow](/) account and workspace. + - A [OttoKit](https://ottokit.com/integrations/baserow) account with access to create workflows. + - Familiarity with Baserow functionalities (tables, fields, rows). + - API access to your Baserow workspace + +## Supported operations + +**Triggers** + + - Row Created - Runs when a new row is created. + - Row Updated - Runs when a row is updated. + - Row Deleted - Runs when a row is deleted. + +> Alternatively, use the [Webhook][3] app to trigger when the webhook receives data. + +**Actions** + + - Create Row - Creates a new row + - Update Row - Updates an existing row + - Delete Row - Deletes an existing row + - List Rows - Finds a page of rows in a given table + - Fetch Row - Finds a single row in a given table + - Custom API Request - Make a custom API request to the Baserow API + +## Configure Baserow trigger in OttoKit + +Create a workflow in OttoKit. A trigger is an event that starts your workflow to streamline your processes and enhance productivity. + +### Select Baserow as the trigger app + +Browse the available apps and choose Baserow as the trigger app. A trigger app initiates a workflow based on specific events happening within the app. In this case, Baserow will be the starting point for your automated processes. + +Choose the specific event in Baserow that will initiate your workflow. Actions within Baserow, such as adding a new row, updating or deleting an existing row, will prompt a response in another application. + +> For more information on creating a webhook in Baserow, see the [support documentation](/user-docs/webhooks). + +![Set up Baserow trigger in OttoKit][2] + +### Configure the trigger + +To configure the trigger, add the webhook URL to Baserow to send notifications to other applications. + +Select **POST** from the **Method** dropdown menu in Baserow. + +> A typo or error in the URL will prevent Baserow from successfully communicating with other applications. Double-check the URL for any mistakes before saving the webhook configuration. + +Choose the specific events that should trigger the webhook. For instance, if you want the webhook to activate when a new row is added, select the ""Rows are created"" checkbox. + +Test the webhook functionality by clicking the **Trigger test webhook** button in Baserow. This will send a test message to the defined URL and display the response within Baserow. + +![Baserow Webhook OttoKit][4] + +### Save and test the workflow + +After selecting the trigger, OttoKit will guide you through defining the actions that follow the trigger event. These actions can involve sending data to another application, calculating, or creating notifications. + +Once you've configured the trigger and subsequent actions, save your workflow and run a test to ensure everything functions as expected. Baserow should initiate the workflow based on the chosen trigger event. + +![test Baserow webhook in OttoKit][5] + +By following these steps, Baserow will send notifications to the other applications whenever the designated events occur within your Baserow tables. + +## Common workflow examples +### Sales & CRM workflows + + - **New lead to CRM**: When a form submission creates a row in Baserow → Create contact in HubSpot/Salesforce + - **Deal tracking**: When deal status changes in Baserow → Update pipeline in CRM and notify sales team + +### Project management workflows + + - **Task creation**: New row in project table → Create task in Asana/Trello/Monday.com + - **Status updates**: When status field changes → Send Slack notification to team + +### E-commerce workflows + + - **Order processing**: New order row → Send confirmation email + Create shipping label + - **Inventory sync**: When stock level changes → Update WooCommerce/Shopify inventory + +### Marketing workflows + + - **Email campaigns**: New subscriber row → Add to Mailchimp list + Send welcome email + - **Content calendar**: When publish date arrives → Post to social media platforms + +## Frequently asked questions + +### Can I generate a database token in Baserow? + +Yes, [Baserow database tokens][6] provide similar functionality to login credentials, but they provide additional security and flexibility. A token, like your username and password, should be kept secure and handled with the utmost confidentiality. Do not share it with others or expose it. + +### Can I filter which rows trigger my workflows? + +Yes, when you add the webhook URL to Baserow settings, you can specify which events should trigger the workflow. For more information on creating a webhook in Baserow, see the [support documentation](/user-docs/webhooks). + +### How fast do triggers fire? + +OttoKit checks for new triggers every 1-15 minutes depending on your plan. + +## Troubleshooting common issues + +| Issue | Solution | +|-------|----------| +| **Connection failed** | Regenerate API token and ensure it has correct permissions | +| **Workflows not triggering** | Check filter conditions and ensure table/field names match exactly | +| **Missing data in actions** | Verify field mappings and data types are compatible | +| **Rate limit errors** | Upgrade plan or implement delays between actions | +| **Duplicate entries** | Add deduplication logic using OttoKit' filter conditions | + +## Related content + +- [Webhooks](/user-docs/webhooks) - Learn about real-time triggers +- [Database API documentation](/user-docs/database-api) - Understand API capabilities +- [Zapier integration](/user-docs/zapier) - Compare with Zapier automation +- [Make integration](/user-docs/make) - Explore Make.com integration +- [n8n integration](/user-docs/n8n) - Set up self-hosted automation +- [Baserow database tokens](/user-docs/personal-api-tokens) - Manage API access + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account. + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/a9cb2c3b-04e0-4253-bad0-f108576eaf40/ottokit.jpg + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/2cec5e44-98c9-4358-84ce-a253a4f42879/suretriggers%20set%20trigger.png + [3]: https://baserow.io/user-docs/webhooks + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/d2d504cf-47cc-4cd9-8e99-faa469ee235c/iNCOMING%20webhook.png + [5]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/fa28096e-3f32-4ec2-856e-e2dcb007ae0a/test%20webhook%20suretriggers.png + [6]: https://baserow.io/user-docs/personal-api-tokens",,baserow_user_docs,https://baserow.io/user-docs/suretriggers-integration +227,Timeline view,guide-to-timeline-view,Timeline view in Baserow tables,"# Timeline view guide + + + +Timeline view displays records as horizontal bars showing duration from start to end date, making it perfect for project roadmaps, resource planning, and any workflow where date ranges matter. + +This guide covers how to use Baserow's Timeline view to visualize project durations, track date ranges, and manage Gantt-style timelines with drag-and-drop scheduling. + +> **Paid feature:** Timeline view requires [Paid plans](/user-docs/pricing-plans). Users on the free plan cannot create timeline views. + +Learn more about views in general: [Views overview](/user-docs/overview-of-baserow-views) + +## What is Timeline view? + +Timeline view shows records as horizontal bars spanning from start date to end date. Unlike [Calendar view](/user-docs/guide-to-calendar-view), which shows events on specific dates, Timeline view emphasizes duration; how long tasks take and how they overlap. This Gantt-style visualization makes project planning and scheduling intuitive. + +**Timeline view excels at:** Project roadmaps and milestones, resource allocation across time periods, multi-phase project planning, campaign timelines with preparation and execution periods, construction or manufacturing schedules, and any workflow where understanding task duration and overlap is critical. + + + +![Timeline view showing project tasks with durations](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/af4f7c70-dfc5-4170-bed2-f2b5f1cb112d/timeline_view.webp) + + + +## Timeline view vs other view types + +| Feature | Timeline | Calendar | Kanban | Grid | +|---------|----------|----------|--------|------| +| **Best for** | Date ranges/durations | Specific date events | Status tracking | Detailed data work | +| **Visualization** | Horizontal bars | Calendar grid | Status columns | Spreadsheet rows | +| **Date requirement** | Start & end dates | Single date | Optional | Optional | +| **Shows duration** | ✓ Bar length | – | – | Text only | +| **Shows overlap** | ✓ Visual | Partially | – | – | +| **Drag to adjust** | ✓ Start/end dates | – | ✓ Status only | – | +| **Time scale** | Flexible zoom | Month/week/day | N/A | N/A | +| **Premium feature** | Yes | Yes | Yes | No | + +Learn more: [Calendar view](/user-docs/guide-to-calendar-view) | [Kanban view](/user-docs/guide-to-kanban-view) | [Grid view](/user-docs/guide-to-grid-view) + +## Create a Timeline view + +Timeline views require **both start and end date fields** to display duration bars. This distinguishes Timeline from Calendar view, which only needs one date field. + +### Prerequisites + +Your table must have two date fields: +- **Start date field** - When tasks/projects begin +- **End date field** - When tasks/projects complete + +If you only have one date field, consider adding an end date field or use [Calendar view](/user-docs/guide-to-calendar-view) instead. + +### Create the view + +1. Click the **view dropdown** at the top-left of the table +2. Select **Timeline** from the view type options +3. Choose [Collaborative](/user-docs/collaborative-views) or [Personal](/user-docs/personal-views) permission type +4. Enter a **name** for the Timeline view +5. **Select the start date field** from your table +6. **Select the end date field** from your table +7. Click **Create view** + +![Creating a Timeline view in Baserow](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/973e2c33-5e01-41d3-8ff9-1b6e28709f34/add_timeline_view_in_baserow.webp) + +Tasks appear as horizontal bars spanning from start to end date. Records with missing start or end dates may not display properly. + +## Configure date settings + +The **Date settings** button in the toolbar shows which date fields currently define the timeline. + +### Change date fields + +1. Click **Date settings** in the toolbar +2. Select different **start date field** from dropdown +3. Select different **end date field** from dropdown +4. Timeline reorganizes with new date configuration + +![Configuring date fields in Timeline view](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/2fff77ca-11ef-492e-ae9b-a29f85f6df51/set_up_timeline_view_in_baserow.webp) + +This lets you create multiple Timeline views of the same data with different date perspectives (e.g., ""Planned Timeline"" using planned dates vs ""Actual Timeline"" using actual dates). + +## Navigate the timeline + +### Timeline controls + +**Scroll horizontally:** Click and drag the timeline or use the scroll wheel to move through time periods + +**Zoom in/out:** Adjust timeline scale to show days, weeks, or months depending on your project scope + +**Today button:** Click **Today** to jump immediately to the current date + +**Arrow buttons:** Use left/right arrows to navigate between time periods + + + +### Interact with taskbars + +**Drag entire bars:** Click and drag task bars left or right to reschedule while maintaining duration + +**Drag bar edges:** Click and drag the left edge to adjust the start date, or the right edge to adjust the end date + +**Hover for details:** Hover over any task bar to see a tooltip with dates and key fields + +**Click to open:** Click any taskbar to open the full record in an [edit modal](/user-docs/enlarging-rows) where you can modify all fields or add [comments](/user-docs/row-commenting) + +Drag-to-adjust makes rescheduling intuitive; visually move tasks on the timeline instead of manually editing date fields. + +## Customize timeline display + +### Configure task labels + +Control which fields display alongside task bars on the timeline. + +1. Click **Labels** in the toolbar +2. **Toggle fields on/off** to show or hide them on task rows +3. Use **Hide all** or **Show all** for quick bulk changes +4. **Drag the handle (⋮⋮)** to reorder fields +5. Use the **search box** to find fields quickly + +![Customizing labels in Timeline view](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/9b001a2b-b70c-4890-8e53-59935979fca7/labels_in_timeline_view_in_baserow.webp) + +Green toggles (switched right) indicate visible fields. Gray toggles (switched left) indicate hidden fields. + +**Label strategy:** Show essential information like task names, owners, and progress indicators. Hide administrative fields. Put the most important fields first for quick scanning. + +### Apply task colors + +Use [row coloring](/user-docs/row-coloring) to color-code task bars based on field values, making different project phases, teams, or priorities visually distinct. + +1. Click **Colors** in the toolbar +2. Click **Add condition** +3. Select a field and condition (e.g., ""Priority = High"") +4. Choose a color for matching tasks +5. Add multiple conditions with different colors + +![Timeline view with navigation controls](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/60c717b8-2045-4b92-8c0e-d0750bdee2d1/timeline_view.png) + +## Timeline view toolbar options + +The toolbar at the top of the Timeline view provides quick access to common operations: + +**[Filter](/user-docs/filters-in-baserow)** - Show only tasks matching specific conditions. Useful for viewing specific projects, team members, or date ranges. + +**[Sort](/user-docs/view-customization)** - Order task rows by field values (priority, owner, start date). Sorting doesn't affect bar positions on the timeline; those are always determined by dates. + +**[Share view](/user-docs/public-sharing)** - Generate public links or embed codes to share timelines externally. + +**[Colors](/user-docs/row-coloring)** - Apply conditional formatting to task bars (covered above). + +**Date settings** - Configure start and end date fields (covered above). + +**Labels** - Customize which fields appear on task rows (covered above). + +## Timeline view management + +Access view management options by clicking the **three-dot menu (⋮)** next to the view name: + +- **[Duplicate view][1]** - Copy configuration to a new view +- **[Import file][2]** - Add data from CSV, JSON, or XML files +- **[Convert view type][3]** - Change between collaborative and personal +- **[Webhooks][4]** - Configure external notifications for timeline events +- **[Rename view][5]** - Update the view name +- **[Delete view][5]** - Remove the view permanently +- **[Configure date dependencies][6]** - Set up relationships between date fields + +Learn more: [View configuration options](/user-docs/view-customization) + +## Why use Timeline view? + +Timeline view provides duration-based visualization that's impossible in [Grid view](/user-docs/guide-to-grid-view) or [Calendar view](/user-docs/guide-to-calendar-view). The horizontal bar layout makes task length and overlap immediately visible. + +**Duration clarity:** See how long each task takes at a glance. Long bars indicate extended projects, short bars show quick tasks. This visual length makes planning more intuitive than reading date fields. + +**Overlap identification:** Spot conflicting schedules or resource conflicts where multiple tasks overlap the same time period. Timeline view makes these conflicts visually obvious. + +**Drag-to-reschedule:** Click and drag task bars to adjust start and end dates directly on the timeline. No field editing required; visual scheduling matches mental models for time management. + +**Scrollable timeline:** Navigate across weeks, months, or years by scrolling and zooming. See short-term details or long-term project arcs by adjusting the timeline scale. + +## Frequently asked questions + +### What's the difference between Timeline view and the Calendar view? + +[Calendar view](/user-docs/guide-to-calendar-view) shows events on specific dates in a monthly grid. Timeline view shows duration bars from start to end date. Use a calendar for events (meetings, deadlines). Use a timeline for tasks with duration (projects, campaigns, development phases). + +### Can I use Timeline view with only one date field? + +No, Timeline view needs start and end dates to show meaningful duration bars. Consider adding an end date field or using a Calendar view instead. + +### How do I handle tasks without end dates? + +Tasks with missing end dates may not display properly on the timeline. Options: (1) Add estimated end dates, (2) Use a [formula field](/user-docs/formula-field-overview) to calculate end dates from start dates plus duration, (3) Filter out incomplete records, or (4) manually assign placeholder end dates. + +### Can I drag tasks to reschedule them? + +Yes. Click and drag entire task bars to move them while maintaining duration. Drag the left edge to adjust the start date or the right edge to adjust the end date. These visual adjustments update the underlying date fields immediately. + +### Why don't my changes appear for other users immediately? + +Timeline views update in real-time when records change. If other users don't see updates immediately, they may need to refresh their browsers. [Collaborative views](/user-docs/collaborative-views) share configurations, but a browser refresh may be needed to see data changes. + +### How do I see tasks that overlap? + +Overlapping tasks appear as stacked bars in Timeline view. If multiple tasks run during the same time period, they stack vertically in their rows. Use filters or sorts to identify conflicts, or color-code by resource/person to spot over-allocation. + +### Can I export Timeline view data? + +Timeline view doesn't have direct export. Switch to [grid view](/user-docs/guide-to-grid-view) to access export functionality, or use [table export](/user-docs/export-tables) to download all data, including dates. The export contains the same data; only the access point differs. + +### What's the maximum timeline duration I can display? + +Timeline view can display any date range from days to years. Very long timelines (multi-year projects) may require significant scrolling. Use zoom controls to adjust the scale; zoom out for big-picture views, zoom in for detailed scheduling. + +## Related resources + +### View basics +- [Views overview](/user-docs/overview-of-baserow-views) - Understanding all view types +- [Create custom views](/user-docs/create-custom-views-of-your-data) - Step-by-step view creation +- [View configuration options](/user-docs/view-customization) - General view settings + +### Timeline features +- [Date and time fields](/user-docs/date-and-time-fields) - Required for timeline views +- [Formula field overview](/user-docs/formula-field-overview) - Calculate dates +- [Row coloring](/user-docs/row-coloring) - Color-code tasks +- [Filters in Baserow](/user-docs/filters-in-baserow) - Show specific tasks +- [Public sharing](/user-docs/public-sharing) - Share timelines externally + +### Related features +- [Row configuration](/user-docs/enlarging-rows) - Open detailed task view +- [Row commenting](/user-docs/row-commenting) - Add task comments + +### Other view types +- [Calendar view](/user-docs/guide-to-calendar-view) - Single-date events +- [Grid view](/user-docs/guide-to-grid-view) - Spreadsheet interface +- [Kanban view](/user-docs/guide-to-kanban-view) - Status-based tracking +- [Gallery view](/user-docs/guide-to-gallery-view) - Visual browsing + +### Plans and features +- [Pricing plans](/user-docs/pricing-plans) - Feature availability by plan + +--- + + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow.io/user-docs/create-custom-views-of-your-data + [2]: https://baserow.io/user-docs/import-data-into-an-existing-table + [3]: https://baserow.io/user-docs/collaborative-views + [4]: https://baserow.io/user-docs/webhooks + [5]: https://baserow.io/user-docs/view-customization + [6]: https://baserow.io/user-docs/date-and-time-fields",,baserow_user_docs,https://baserow.io/user-docs/guide-to-timeline-view +228,Data sync,data-sync-in-baserow,Create a table in Baserow using data sync,"# Create a Baserow table via data sync + +Data synchronization ensures your external data is consistent and up-to-date across multiple platforms and tables. Perfect for dashboards and unified reporting. + +By automating the process of updating data, you can eliminate the need for manual updates in different systems. This guarantees that everyone within your organization has access to the latest information, reducing errors and increasing efficiency. + +> Some sync sources (Baserow, Jira, GitHub, GitLab, Hubspot) are available with a [paid plan][3]. To access them, please upgrade your account by subscribing. + +This section will guide you through the process of setting up and managing data sync in Baserow. + +For other ways to create a Baserow table, please see these articles: + + - [Start with a new table](/user-docs/create-a-table#start-with-a-new-table) + - [Duplicate an existing table](/user-docs/create-a-table#duplicate-a-table) + - [Paste table data](/user-docs/create-a-table-via-import#paste-table-data) + - [Create a new table from an import](/user-docs/create-a-table-via-import). + +## Overview of data sync + +Data sync creates live-updating tables that automatically pull information from external sources. Unlike manual imports, synced tables refresh automatically, ensuring everyone works with the latest data without manual updates. + +Data sync eliminates manual data entry and ensures single-source-of-truth consistency across platforms. + +> Synced tables are read-only in Baserow, meaning you modify data at the [source][1] and see changes reflected automatically. + +![Screenshot of data sync in Baserow][2] + +## How to set up data sync + +Setting up any sync source follows the same basic pattern, with source-specific connection details varying. + + +### Basic setup process + +1. Navigate to your database in the sidebar and click **+ New table** +2. Select your [sync source][1] from the available integration options +3. Enter connection details specific to your source (see source sections below) +4. Name your synced table descriptively to identify the data source +5. Select fields to sync. You don't need all fields; choose only what's relevant. + > [Field types](/user-docs/baserow-field-overview) cannot be changed on synced fields. +6. Toggle on **Auto add new properties** to automatically add and synchronize newly available properties from the data source into the Baserow table. Note that for this to work, all properties must be synced. +7. Click **Create and sync table** to establish the connection + +![Setting up a synced table](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/e1da198d-17ef-495d-9ee7-6eb1bb6d5640/screenshot_of_baserow_sync_table.webp) + +Your table is created immediately and begins syncing. Data appears as read-only with sync indicators (arrows) beside field names. + +## Data sync sources + +Data sync in Baserow can integrate with multiple sources: + +| Source | Best for | Update frequency | Two-way sync | +|--------|----------|------------------|--------------| +| **PostgreSQL** | Database integration | Manual/scheduled | Yes | +| **Baserow table** | Cross-workspace data | Manual/scheduled | No | +| **Jira issues** | Project management tracking | Manual/scheduled | No | +| **GitHub issues** | Development workflow | Manual/scheduled | No | +| **GitLab issues** | DevOps integration | Manual/scheduled | No | +| **HubSpot contacts** | CRM synchronization | Manual/scheduled | No | +| **iCal feed** | Calendar and events | Manual/scheduled | No | + +## Sync source configurations + +### Sync iCal feed + +iCal feed sync is designed to bring calendar data into Baserow. The iCal calendar sync synchronizes automatically with the entries in the URL's calendar file. + +It supports the ICS (Internet Calendar and Scheduling) file type. Simply provide the iCal URL from your calendar service. + +This is useful for syncing shared calendars, project timelines, or event schedules across different platforms into a single database. + +### Sync PostgreSQL table + +Connect directly to PostgreSQL databases to view and manage data in Baserow's interface. Supports optional two-way sync for editing data in Baserow and pushing changes back to PostgreSQL. + +#### Connection setup + +To initiate the synchronization process, you’ll need to provide the following information: + +- **Server hostname**: The address of your PostgreSQL server. +- **Username**: The username used to access the database. +- **Password**: The corresponding password for the specified username. +- **Database name**: The name of the database containing the table you want to synchronize. +- **Schema name**: The schema within the database where the table resides. +- **Table name**: The exact name of the PostgreSQL table you wish to synchronize. +- **Port number**: The port number used by the PostgreSQL server. +- **SSL mode**: The desired SSL mode for the connection. + +When you first set up synchronization, Baserow will select all rows from the specified PostgreSQL table. + +#### Two-way synchronization + +Baserow supports two-way sync with PostgreSQL, extending the data sync feature to keep information consistent between Baserow and your PostgreSQL databases. + +With two-way sync enabled, you can sync changes from PostgreSQL into Baserow to keep your workspace up to date, and push updates made in Baserow back to PostgreSQL in real time. + +After connecting your PostgreSQL database and selecting the fields you want to sync: + +1. **Toggle the “Two-way sync” option.** + - This allows you to edit cell values directly in Baserow and push the updates back into your PostgreSQL database. + - Changes are sent to PostgreSQL in real time. Updates from PostgreSQL are pulled when the periodic sync runs. +2. Click **Create and sync table** to finish setup. + +> **Important**: We recommend creating backups of your PostgreSQL database before enabling two-way sync to avoid accidental changes. + +#### Permissions + +If you only intend to use one-way sync (PostgreSQL → Baserow), we advise limiting the user account used for synchronization to **read-only** permissions. This prevents accidental or malicious modifications to your PostgreSQL data. For two-way sync, ensure the account has appropriate write permissions. + +### Sync Baserow table + +Baserow table sync allows you to synchronize tables across different [workspaces](/user-docs/intro-to-workspaces) in Baserow. This ensures that updates in the source table are reflected automatically in synced versions. + +**Required details:** Select source workspace, database, and table from dropdowns. + +![Screenshot to Select the fields you would like to sync][4] + +### Sync Jira issues + +Baserow offers integration with Jira, allowing you to sync your issues and maintain a unified view across different teams. This eliminates the need to constantly switch between tools and manually update information on both platforms. + +Here's how to establish the connection: + + 1. Locate your Jira instance URL: The base URL of your Jira instance (e.g., `https://your-domain.atlassian.net`). + 2. Provide your Jira credentials: Baserow requires authentication to access your Jira data. Authenticate with either a Personal Access Token (recommended) or username with API token from [Atlassian account security settings](https://id.atlassian.com/manage-profile/security/api-tokens). + 3. Specify Jira project key (Optional): Optionally specify a project key to sync only specific projects. Leaving this field blank will result in importing all issues from your Jira instance. + +> The personal access token authentication method provides improved security and allows for more granular permission management compared to traditional username/password authentication. + +### Sync GitHub issues + +Synchronize GitHub issues with Baserow for unified tracking. Here's how to establish the connection: + + - **Owner**: Username or owner of the repository. Typically in the top left corner `owner / repo` + - **Repository**: The name of the repository. Typically in the top left corner `owner / repo` + - **API token**: Generate an API token from [GitHub settings](https://github.com/settings/tokens) with read-only access to Issues under Repository permissions. + +### Sync GitLab issues + +Connect GitLab projects for issue tracking. Here's how to set up the integration: + + - **Base URL**: Enter your GitLab base URL (e.g., `https://gitlab.com`) + - **Project ID**: Found by clicking the three-dot menu in your project and selecting ""Copy project ID"" + - **Access token**: Create a personal access token with `read_api` scope from [GitLab user settings](https://gitlab.com/-/user_settings/personal_access_tokens) + +![Image: Sync GitLab issues][5] + +### Sync HubSpot contacts + +Synchronize HubSpot CRM contacts directly into Baserow. Here's how to set up the synchronization + + - Name: The table requires a name to help identify and organize your data. + - Private app access token: Generate a private app access token from HubSpot (Settings > Integrations > Private Apps) with these scopes: `crm.objects.contacts.read`, `crm.schemas.contacts.read`, and `crm.objects.custom.read` + +Use this token during the table setup process to establish a secure connection between HubSpot and Baserow. + +![image_hubspot_data_sync][6] + +## Manage and update sync settings + +Once a sync is established, you can easily manage and update it as needed. The [field configuration options][7] are available. You can also [create and manage views][8]. + +With these integrations, you can synchronize data in external platforms directly into Baserow, simplifying workflows, improving collaboration, and making data management more efficient. + +You have the flexibility to choose only the fields relevant to your workflow, which helps to keep your workspace clean and focused. + +> The sync table feature only supports field types like single text, number, date, and boolean. Calculated fields like Link to table, Lookup, Rollup and Formula cannot be synced. This is because the value of those fields might depend on other tables that have a different set of permissions. + +### Trigger manual sync + +While sync can be scheduled, you can manually refresh data anytime. This will refresh the data, pulling the latest information from the main source. + +To pull the latest data from your connected source into Baserow, + + 1. Go to the synced table in Baserow and click on the three-dot menu to open the table options. + 2. Click **Sync table**. + +During this process, a lock is placed on the updated rows, which may temporarily slow down API requests or table modifications. + +### Periodic sync + +Configure automatic sync schedules through the ellipsis menu of any synced table. The default interval setting is set to ""Manual"" and can be changed to either ""Hourly"" or ""Daily"". Periodic sync offers three intervals: + +![image sync settings][9] + + - **Manual (default):** No automatic syncing—trigger updates only when needed. + + - **Hourly:** Sync runs every hour at a specific minute and second you define (e.g., 29 minutes and 18 seconds past each hour). + +![Hourly sync schedule settings](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/user_files/KshOKWGHedPZuZMyOaVcdsVwZSlNd9Xp_3be5b5805528eddf66dc95d7729fcbdf6bbdb98ff2725f0607d674c558ad8cca.png) + + - **Daily:** Sync occurs once per day at a specific time you set using 24-hour format (e.g., 16:29:18 for 4:29:18 PM). + +![Daily sync schedule settings](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/user_files/O24Ax8tN1cMsz6UfGkTTxvP6rVyDVNzM_097dd28d744e7a5d6fbf0375730349211d7f60255974000afa50eb37b5c6cd42.png) + +### Add new fields + +Synced fields are read-only, but you can [add new editable fields](/user-docs/adding-a-field) to synced tables for tracking additional information not provided by the source. These custom fields don't interfere with synced data and update independently. + +Synced fields display an arrow indicator to distinguish them from [custom editable fields][7]. + +![Identifying synced vs. custom fields](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/1338865f-6680-4868-b330-4f2b6307c85b/screenshot_to_identify_a_synced_field.webp) + +### Customize views + +Although data is read-only, you can [create multiple views](/user-docs/overview-of-baserow-views) of synced tables with different filters, sorts, and groupings. This lets different teams see synchronized data in ways that suit their workflows without affecting the underlying sync. + +## Frequently asked questions + +### Can I edit data in synced tables? + +No, synced tables are read-only by default. This prevents conflicts between Baserow and your source system. To change data, modify it at the source and trigger a sync update. The exception is PostgreSQL with two-way sync enabled, which allows editing in Baserow and pushes changes back to PostgreSQL. + +### What's the difference between data sync and importing? + +Importing creates a one-time copy of data that becomes independent from the source. Data sync maintains an ongoing connection where tables automatically update when source data changes. Use imports for static data you'll modify in Baserow, use sync for live dashboards and reporting. + +### How often does data sync refresh? + +By default, syncs are manual; you trigger them when needed. Configure periodic sync for automatic hourly or daily updates at specific times. Real-time sync isn't available; there's always a delay between source changes and Baserow updates. + +### Can I sync data from multiple sources into one table? + +No, each synced table connects to a single source. To combine data from multiple sources, create separate synced tables and use [Link to table fields](/user-docs/link-to-table-field) on regular (non-synced) tables to reference and combine the information. + +### What happens if my sync source becomes unavailable? + +Synced tables retain their last successfully synced data. When the source becomes available again, trigger a manual sync or wait for the next scheduled sync to update. No data is lost during source outages; tables simply don't update until connectivity restores. + +## Related content + +**Understand synced data:** +- **[Field types overview](/user-docs/baserow-field-overview)** – Learn which field types can sync +- **[Field customization](/user-docs/field-customization)** – Add custom fields to synced tables +- **[Create views](/user-docs/overview-of-baserow-views)** – Visualize synced data different ways + +**Alternative table creation methods:** +- **[Create blank tables](/user-docs/create-a-table#start-with-a-new-table)** – Start from scratch for full control +- **[Import data](/user-docs/create-a-table-via-import)** – One-time data transfer from files +- **[Duplicate tables](/user-docs/create-a-table#duplicate-a-table)** – Copy existing structures + + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account. + + + [1]: #data-sync-sources + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/279cf13c-95fd-47e8-a8ed-16471d2e8acc/data_sync.webp + [3]: https://baserow.io/pricing + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/a2733ae8-2dad-49da-aae1-713485ab67af/screenshot_to_select_the_fields_you_would_like_to_sync.webp + [5]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/920300d9-ac20-4aab-9c2a-40c4d94a1981/data_sync_jira_gitlab_github_and_postgresql.webp + [6]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/f5ec7571-448f-4bc4-8eca-a1feab1c430d/image_hubspot_data_sync.webp + [7]: /user-docs/field-customization + [8]: /user-docs/overview-of-baserow-views + [9]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/8ba3e6b7-0d17-4285-90de-f1a824861d45/data_sync.png + [10]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/user_files/O24Ax8tN1cMsz6UfGkTTxvP6rVyDVNzM_097dd28d744e7a5d6fbf0375730349211d7f60255974000afa50eb37b5c6cd42.png + [11]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/user_files/KshOKWGHedPZuZMyOaVcdsVwZSlNd9Xp_3be5b5805528eddf66dc95d7729fcbdf6bbdb98ff2725f0607d674c558ad8cca.png + [12]: /user-docs/adding-a-field + [13]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/1338865f-6680-4868-b330-4f2b6307c85b/screenshot_to_identify_a_synced_field.webp",,baserow_user_docs,https://baserow.io/user-docs/data-sync-in-baserow +260,Record selector element,application-builder-record-selector-element,Record selector element in Baserow Application Builder,"# Application Builder - Record selector element + +The Record Selector simplifies linking and selecting rows from related tables. This is useful when selecting any of the thousands of rows from a related table to populate a link row field. + +In this section, we'll provide detailed instructions and best practices for using the Record Selector element in the Application Builder. + +![Baserow Record selector element][1] + +## Overview + +The Record Selector enables you to populate a link row field by selecting from rows in another table. This is ideal for scenarios where dynamic data connections are needed, such as assigning roles, linking tasks, or selecting categories from a related dataset. + +The Record Selector handles thousands of rows using dynamic data loading, ensuring fast performance even for large datasets. + +You can configure the element properties and [style](/user-docs/element-style) from the element settings. + +The Application Builder allows you to bind the text to [data sources](/user-docs/data-sources). This allows the text to update dynamically based on user input or application logic. You can also populate the options with data retrieved from data sources. This offers a dynamic way to manage options. + +## Add the record selector to an application + +To add a record selector element, access the [elements panel](/user-docs/elements-overview) and select **Record selector**. + +Once added, place the record selector element wherever you want it on the [page](/user-docs/pages-in-the-application-builder). Don't worry if it's not perfectly positioned initially; you can always move it later. + +Learn more about how to [add and remove an element from a page](/user-docs/add-and-remove-elements). + +Then, you can configure the record selector element's properties to make it function and look the way you want. This involves settings related to the record selector element style. + +## Configure the Record Selector settings + +Once the element is added, configure its properties in the settings panel. You can populate the options with data retrieved from data sources. The dropdown dynamically reflects changes in the linked table, ensuring real-time updates. + +The following settings are available: + + - **Select records from**: Choose the [data sources](/user-docs/data-sources) you want to pull records from. Example: Job roles or Departments. + - **Items per page**: Define how many rows are displayed in the selector view. Example: 20. This number must be greater than or equal to 5 but less than or equal to 100. + - **Option name suffix**: Add a suffix to distinguish rows when displayed in the dropdown. Example: combining multiple data fields like ""Company - [Value]"". + - **Label**: Enter a clear label for the field. Example: ""Select one or more roles"". + - **Placeholder**: Add placeholder text to guide users on what to do. Example: ""Make a selection"". + - **Default value**: Pre-define the field’s initial value using a specific data source or default logic. Example: Default to the first row. If you don’t define a default value, the field will remain empty until the user selects a row. + - **Allow multiple values**: Toggle this option if you want users to select more than one row. + - **Required**: Check this box if the field must be completed before submission. + - **User actions**: You can configure search functionality for external users by selecting relevant properties under the **User actions** section. + +## User actions + +For each element, you can specify which fields to make searchable for external users to give end-users more control to search within the [published application][3]. + +To add searching capabilities, click on the element and navigate to the right sidebar. There, you’ll see checkboxes to enable Search for specific fields. + +![Record selector element - User actions][2] + +This creates a more interactive and user-friendly experience. + +![Configure the Baserow Record Selector Settings][4] + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/9349ad70-8f47-4366-b169-c7faed797819/record_selector_element.webp + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/0c1c59c5-06db-4212-b52a-ef7003823a2a/record_selector_element_user_actions.webp + [3]: /user-docs/preview-and-publish-application + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/868ff5a8-d4f3-4184-b945-1e8a7f289349/Screenshot%202024-12-10%20at%2013.17.39.png",,baserow_user_docs,https://baserow.io/user-docs/application-builder-record-selector-element +261,Export a workspace,export-workspaces,Export Baserow workspace data,"# Export workspace data from Baserow + +Export complete workspaces or select specific databases, applications, and dashboards to create portable ZIP backups. Export structure-only or include all data for migrations, backups, or sharing with other Baserow instances. + +## Overview + +Workspace exports give you complete control over your Baserow data. Whether you're creating backups, migrating to a different Baserow instance, sharing templates with colleagues, or archiving completed projects, Baserow's flexible export system lets you choose exactly what to include. Export everything at once or select specific databases and applications. + +## When to export a workspace + +Exporting a workspace is useful in several scenarios. For backup and disaster recovery, it lets you create regular backups, protect against accidental deletions, and maintain version history. + +For migration and deployment, exports make it easy to move workspaces between Self-hosted instances, transfer from Baserow Cloud, or deploy tested configurations into production. + +Exports also support collaboration and sharing by allowing you to share workspace templates, distribute pre-configured solutions, and create starter templates for teams or clients. + +In testing and development, you can clone production workspaces to experiment safely, test new features, or create sandbox environments without affecting live data. + +![Image Baserow outlined workspace][2] + +## How to export a workspace + +Follow these steps to export complete workspaces or selected content. + + 1. Click the **Home** tab in the top navigation menu. You'll see a list of all workspaces you have access to + 2. Locate the workspace you want to export. A dropdown menu appears with workspace options. + 3. Click **Export data** from the dropdown menu. The export dialog opens, showing all workspace contents + 4. Choose what to export. The export dialog displays all exportable content organized by type. Use **Select all** to include everything in the workspace at once. Use **Deselect all** to clear selections. Use individual toggles to fine-tune exactly what to export. + 5. Configure export options. ☑ Check **Export structure only** to exports table structures, fields, views, and configurations WITHOUT data rows. ☐ **Uncheck** to export complete data, including all rows and content. + 6. Generate and download the export. Click the **Export data** button + +Baserow generates a ZIP file (may take a few moments for large workspaces). The file downloads to your default download folder. + +After exporting, you can import the ZIP file into any Baserow instance. [Complete guide to importing workspaces →][3] + +### Export settings + +You can choose how to export your database depending on what you need to share or back up. + +**Structure-only exports** are ideal when you want to create templates for others to fill in, share database schemas without including sensitive data, set up development environments, or reduce file size for large databases. This option exports only the database structure, not the data itself. + +**Exports that include data** are best when you need a complete backup, are migrating your database to another instance, want to share fully populated examples, or are archiving finished projects. This option preserves both the database structure and its content. + +![Export Baserow Workspace][1] + +## What gets exported + +### Included in exports + +When you export a workspace, you can choose to include all content or select specific items. This includes databases, applications, dashboards, and automations. + +You can choose to export all data across tables, file attachments, and collaborator references. + +### Not included in exports + +Workspace exports do not include: + +- **Workspace members and permissions**: Invite collaborators separately after import +- **Published application domains**: Reconfigure custom domains after import +- **Webhooks**: Recreate webhook configurations manually +- **User-specific settings**: Personal views, preferences, notifications + +## Managing exported files + +### File storage and security + +Exported ZIP files contain complete workspace structure, potentially sensitive data, user-generated content, database relationships and configurations + +### File size considerations + +Export file sizes vary based on the number of databases and tables, the total row count across tables, file attachments, the number of applications and dashboards, and whether data is included or structure-only. + +For large workspaces, consider exporting in smaller batches if needed, using structure-only for initial migrations, importing data separately, or database-level exports for very large workspaces + +## Frequently asked questions + +### Can I export individual databases instead of entire workspaces? + +Yes. In the export dialog, select specific databases while leaving others unchecked. This creates a partial workspace export containing only selected content. + +### How long does it take to export a workspace? + +Small workspaces (few databases, minimal data) export in seconds. Large workspaces with thousands of rows or many file attachments may take several minutes. Progress is shown during generation. + +### Can I schedule automatic exports? + +Not through the UI currently. For automated backups, use the Baserow API to trigger exports programmatically on a schedule. Self-hosted users can implement server-level backup solutions. + +### What happens to file attachments in exports? + +File attachments are included in exports by default, increasing file size significantly. Structure-only exports exclude file attachments but preserve field configurations. + +### Can I import a Cloud workspace export to Self-hosted? + +Exports are compatible across Baserow Cloud and Self-hosted instances. However, premium features may require appropriate licenses on the target instance. + +### Will exported workspaces work on older Baserow versions? + +Exports are forward-compatible but may not work on significantly older Baserow versions. Import to the same version or newer for best results. + +### Can I edit the ZIP file contents before importing? + +Technically possible but not recommended. Manual editing can corrupt the export structure and prevent successful imports. Make changes through Baserow's interface instead. + +### Do exports include workspace permissions? + +No. Workspace member lists and permission assignments are not included. Invite members and configure permissions after importing. + +### What's the maximum export file size? + +No hard limit exists, but very large exports (multiple GB) may be impractical. Consider splitting into smaller exports or using structure-only for initial migrations. + +### What are some best practices for workspace exports? + +Store exports in secure, encrypted locations. Never share exports containing sensitive data over unsecured channels. Limit access to trusted users only. Delete temporary exports after successful imports. Use password-protected archives for extra security. + +## Troubleshooting + +### Export takes too long or fails + +This may be due to very large workspaces, poor connection, or server timeout. + +Try structure-only export first, export databases individually, check internet connection stability, and for self-hosted, increase server timeout limits + +### Imported workspace missing content + +This may be due to partial export, import errors, or incompatible versions. + +Verify all items were selected in the export dialog, check the export ZIP file isn't corrupted, review import logs for error messages, and re-export and retry import. + +### Cannot download exported file + +This may be due to browser settings, download restrictions, or file size. + +Check browser download permissions, disable pop-up blockers temporarily, try a different browser, and clear browser cache and retry. + +### Import fails with error message + +This may be due to version incompatibility, a corrupted file, or insufficient permissions. + +Ensure the target instance is the same or newer version, re-download and re-upload the export file, verify you have admin permissions on the target workspace, and check the server logs for detailed error information. + +## Related content + +### Workspace management +- [Introduction to workspaces](/user-docs/intro-to-workspaces) +- [Set up a workspace][4] +- [Import a workspace][3] +- [Delete a workspace][5] + +### Data management +- [Create a table via import][6] +- [Import data into an existing table][7] +- [Export tables](/user-docs/export-tables) +- [Snapshots](/user-docs/snapshots) + +### Backup and migration +- [Database API for automation](/user-docs/database-api) +- [Deploy Baserow: Choose your hosting option](/user-docs/set-up-baserow) +- [Enterprise admin panel](/user-docs/enterprise-admin-panel) + +### Security +- [Understanding permissions](/user-docs/permissions-overview) +- [Role-based access control](/user-docs/role-based-access-control-rbac) +- [Manage workspace members](/user-docs/manage-workspace-permissions) + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](https://baserow.io/contact) for questions about Baserow or help with your account + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/f92f2056-8bc9-45e0-846c-3d98509c39be/Export%20Baserow%20Workspace.jpg + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/fc69982d-7b90-4f65-a65f-a0d0ad2ced26/Baserow%20outlined%20workspace.jpg + [3]: /user-docs/import-workspaces + [4]: /user-docs/setting-up-a-workspace + [5]: /user-docs/delete-a-workspace + [6]: /user-docs/create-a-table-via-import + [7]: /user-docs/import-data-into-an-existing-table",,baserow_user_docs,https://baserow.io/user-docs/export-workspaces +262,Import a workspace,import-workspaces,Import a workspace in Baserow account,"# Import a workspace into Baserow + +Import complete workspaces from ZIP files to migrate between Baserow instances, restore backups, or duplicate workspace configurations. + +The import process preserves databases, applications, dashboards, and structure while requiring post-import configuration for members and automations. + +## Overview + +Workspace imports give you the flexibility to transfer your Baserow work between instances, restore from backups, or replicate configurations across teams. + +Whether you're migrating from development to production, moving between Baserow Cloud and Self-hosted, or sharing workspace templates with colleagues, the import process ensures your databases, applications, and dashboards transfer completely and accurately. + +![Importing a workspace in Baserow][1] + +## When to import a workspace + +Importing a workspace is useful in several scenarios: + + - Migration between instances: Move workspaces between Baserow instances, such as from Cloud to Self-hosted, or from development to production, without rebuilding manually. + - Backup restoration: Quickly restore a workspace after accidental deletions, data corruption, or configuration errors. + - Template distribution: Share standard workspace structures for projects, CRM setups, or dashboards to save setup time and ensure consistency. + - Development and testing: Clone production workspaces to test or staging environments for safe experimentation. + - Collaboration: Share complete workspaces with partners, clients, or teams to transfer knowledge and configurations easily. + +## Before you import + +Ensure your workspace import starts with proper preparation: + + - Use a compatible export file: Only ZIP files created by Baserow's export function can be imported. Files from other platforms or arbitrary ZIPs won’t work. + - Check version compatibility: The target instance should run the same or newer version than the source to avoid feature loss or import failures. + - Know what transfers: Imports include databases, tables, fields, relationships, applications, dashboards, views, automations, and optionally row data and attachments. Workspace members, permissions, webhooks, published domains, and personal settings are not transferred. + - Consider file size and storage: Large exports can be several gigabytes. Ensure sufficient storage and a stable network connection. Self-hosted servers must also have adequate capacity. + - Security: Only import files from trusted sources. Export files contain all data, including sensitive information. Store them securely and delete after import if needed. + +[Learn how to export workspaces →][2] + +## How to import a workspace + +Import as a new workspace to create a separate workspace, or merge with an existing workspace to add content to the current workspace. You can also choose to import the structure only or include all row data. + + 1. Log in to your target Baserow instance and go to the **Home** page. + 2. Locate the workspace where you want to import data. Click the arrow next to the workspace name and select **Import data**. + 3. Upload your workspace export file by clicking the upload area or dragging the ZIP file into the interface. Baserow will validate the file to ensure it’s a compatible workspace export. + 4. Select applications to import. + 5. Confirm your settings and start the import. The process duration depends on workspace size. Wait for it to complete before closing the browser. + +After completion, verify the imported content by checking databases, tables, applications, dashboards, and views to ensure everything transferred correctly. + +## Post-import configuration + +After importing a workspace, several steps are required to make it fully operational. Document dependencies before exporting, including database applications, external integrations, and webhooks that may need recreation. + +**Invite members**: Imports don’t include collaborators or permissions. Add team members and assign roles via Workspace Settings → Members. [Guide to inviting collaborators →](/user-docs/working-with-collaborators) + +**Reconnect integrations**: Webhooks and external services don’t transfer. Recreate webhooks and reconnect integrations. + +**Republish applications**: Reconfigure published applications and custom domains, as these settings don’t carry over automatically. + +**Test everything**: Validate functionality in a staging environment first. Check navigation, forms, linked fields, formulas, and permissions before using in production. + +## Troubleshooting import issues + +**Upload timeout or connection lost** + +Large files may exceed upload timeouts, especially with slow internet connections. Try compressing very large workspaces by exporting structure-only first, splitting large workspaces into smaller database-level exports, or using a faster network connection for upload. + +Start with structure-only imports when setting up new environments or sharing templates. Import full data separately if needed. This reduces file size and speeds up initial configuration. + +**Untrusted signature error** + +Error: The provided file is signed with an untrusted public key. Ask your administrator to add the public key to the list of trusted keys or disable the signature verification to be able to import this file. + +Every exported archive is signed to be imported into the same instance without any additional operation. If you want to import locally in Baserow Self-hosted what you exported from Cloud, you need to add the Cloud public keys to the list of trusted sources first, or [disable the security check][3] that the instance admin can find in the settings. + +![Admin settings][4] + +**Missing data or incomplete import** + +If imported workspaces lack expected data, verify the export included data (not just structure), check that the export completed successfully before import, and ensure the target instance has sufficient storage. Re-export and retry if necessary. + +**Modules don't function correctly** + +Baserow modules rely on specific database structures and data sources. If applications fail after import, verify all required databases and tables imported successfully, check that data source configurations point to the correct tables, and review element settings for broken references. + +## Frequently asked questions + +### Can I import workspaces from Airtable or other platforms? + +No. Workspace imports only work with Baserow export files. For Airtable migrations, use Baserow's dedicated [Airtable import tool][5], which handles database structure and data conversion. + +### What happens to workspace members during import? + +Workspace member lists and permissions don't transfer. You must manually invite collaborators and assign roles after importing. This ensures you control who has access in the new instance. + +### Can I import the same workspace multiple times? + +Yes. Each import creates a new copy unless you explicitly merge with an existing workspace. Multiple imports are useful for testing, creating copies for different teams, or maintaining separate development and production versions. + +### Do published applications work immediately after import? + +No. Published applications require reconfiguration, including setting up publishing, configuring custom domains if used, and verifying that authentication works correctly. Applications import successfully, but aren't automatically published. + +### How long do imports take? + +Import time varies dramatically. Small workspaces import in under a minute. Large workspaces with thousands of rows and file attachments may take 10-30 minutes or longer. Progress indicators show status during processing. + +### Why can't I import untrusted ZIP files? + +Security restrictions prevent importing files from unknown sources. Malicious imports could contain harmful configurations or expose security vulnerabilities. You can import existing Baserow data by uploading the .zip file from another Baserow instance. It's not possible to import a zip file from an untrusted source. + +### Do imports count toward my plan limits? + +Yes. Imported workspaces, databases, and rows count toward your subscription plan limits. Ensure your plan has sufficient capacity before importing large workspaces. + +## Related content + +### Workspace management +- [Introduction to workspaces](/user-docs/intro-to-workspaces) +- [Set up a workspace][6] +- [Export workspace data][2] +- [Delete a workspace][7] + +### Data import options +- [Create a table via import][8] +- [Import data into an existing table][9] +- [Import from Airtable](/user-docs/import-airtable-to-baserow) + +### Migration and deployment +- [Deploy Baserow: Choose your hosting option](/user-docs/set-up-baserow) +- [Understanding permissions](/user-docs/permissions-overview) +- [Working with collaborators](/user-docs/working-with-collaborators) + +### Backup and recovery +- [Snapshots](/user-docs/snapshots) +- [Database API](/user-docs/database-api) + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](https://baserow.io/contact) for questions about Baserow or help with your account + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/4b695b1f-f545-4927-be45-f3d32af39776/export_and_import_of_workspaces.webp + [2]: /user-docs/export-workspaces + [3]: https://baserow.io/user-docs/admin-panel-settings + [4]: https://community.baserow.io/uploads/default/original/2X/1/11ce018165cf74a22a097e4ead8a8daf351267e8.png + [5]: https://baserow.io/user-docs/import-airtable-to-baserow + [6]: /user-docs/setting-up-a-workspace + [7]: /user-docs/delete-a-workspace + [8]: /user-docs/create-a-table-via-import + [9]: /user-docs/import-data-into-an-existing-table",,baserow_user_docs,https://baserow.io/user-docs/import-workspaces +293,Date-time picker element,application-builder-date-time-picker-element,Date-time picker element in Baserow Application Builder,"# Application Builder - Date-time picker element + +The date-time picker element offers a user-friendly way to input dates and times in your application. Rather than typing dates manually as text strings, users can select dates from a calendar interface. You can configure the element to show or hide the time field and set the date and time format. + +![Image: Baserow date_time_picker][1] + +## Overview + +The date-time picker enables you to select specific dates and times for your records using this intuitive date-time picker. Ideal for scheduling events, tracking deadlines, recording timestamps, and more. + +You can configure the element properties, and [customize its appearance](/user-docs/element-style) from the element settings. + +## Add the date-time picker to an application + +To add a date-time picker element, access the elements panel and select the date-time picker. + +Once added, place the date-time picker element wherever you want it on the page. Don’t worry if it’s not perfectly positioned initially; you can always move it later. + +[Learn more about how to add and remove an element from a page.](/user-docs/add-and-remove-elements) + +Then, you can configure the date-time picker element’s properties to make it function and look the way you want. This involves settings related to the date-time picker element style. + +## Configuring the date-time picker element + +The date-time picker element can be configured with the following options + +- **Label:** Enter a descriptive label for the date-time picker field. This label will be displayed to users. +- **Default value:** Optionally, set a default date-time value that will be pre-populated in the field. +- **Required:** Check this box to make the field mandatory for users to fill. +- **Date format:** Select the preferred date format from the dropdown list. Options include: + - **European (25/04/2024)**: Day/Month/Year format + - **US (04/25/2024)**: Month/Day/Year format + - **ISO (2024-04-25)**: Year-Month-Day format +- **Include time:** Check this box if you want users to be able to select a specific time in addition to the date. + +The Application Builder allows you to bind the label or default value to [data sources](/user-docs/data-sources). This allows the date to update dynamically based on user input or application logic. + +By customizing these style properties, you can create inputs that match the look and feel of the page. + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/132f134d-6ec5-477f-b703-b26b01060dbf/date_time_picker.webp",,baserow_user_docs,https://baserow.io/user-docs/application-builder-date-time-picker-element +294,Multi-page container,application-builder-multi-page-container,Multi-page container in Baserow Application Builder,"# Application Builder - Multi-page header and footer elements + +Multi-page header and footer elements allow you to create reusable containers that can be applied across multiple pages of your application. + +This streamlines your workflow by allowing you to define a consistent structure once and apply it throughout your application. This not only saves time but also ensures design consistency. + +![Image: Baserow multipage header and footer][1] + +## Overview + +The header and footer elements are perfect for common page elements like navigation bars, branding, or footer information. + +With the reusable design, you can apply the same header or footer to multiple pages, update it once, and changes reflect across all linked pages. + +You can configure styling and layout using the element settings. For further details, refer to the [element style customization guide][2]. + +## Add a multi-page container + +To add the multi-page header or multi-page footer to a [page][3]: + +1. Open the elements panel from the page editor interface. +2. Scroll through the list or search for: + - **Multi-page header** to add a reusable header: Add navigation menus, logos, or search bars to all pages. + - **Multi-page footer** to add a reusable footer: Include contact information, links to privacy policies, or copyright text. +3. Select to add the desired element to the page. + +## Configure the multi-page element + +The header will automatically position itself at the top of the page. The footer will automatically position itself at the bottom of the page. + +Once you’ve added the header or footer, you can customize how and where it appears. + +### Display settings + +You have three options to configure visibility where headers or footers appear across your pages: + +1. **On all pages** + +The element appears on every page within your application. + +2. **Only on selected pages** + +You can choose specific pages where the element should appear. A list of all pages will be displayed for easy selection. For example, apply a footer only to specific content pages like About or Contact. + +3. **Exclude selected pages** + +The element will appear on all pages except those you select. For example, exclude the header from a login page or a specialized landing page. + +### Steps to configure display settings + +1. Click on the **Multi-page header** or **Multi-page footer** element in the editor. +2. Open the **General settings** panel. +3. Under the **Display** section, choose one of the [following display settings][4]: + - On all pages + - Only on selected pages + - Exclude selected pages +4. For selective options, use the displayed list to check/uncheck pages as needed. + +For more design control, combine multi-page headers/footers with elements like [columns][5] or [buttons][6] for dynamic layouts. + +You can [edit or update][7] the multi-page elements at any time; changes are reflected across all pages where they are applied. + +## Related content + +- [Customizing element style][2] +- [Managing page layouts and elements][7] + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/c4f30052-7e54-4083-834f-9eef7429b5fb/multi_page_header_and_footer_elements.webp + [2]: /user-docs/element-style + [3]: /user-docs/pages-in-the-application-builder + [4]: #display-settings + [5]: /user-docs/application-builder-columns-element + [6]: /user-docs/application-builder-button-element + [7]: /user-docs/elements-overview",,baserow_user_docs,https://baserow.io/user-docs/application-builder-multi-page-container +326,Dashboards overview,dashboards-overview,Dashboards overview in Baserow,"# Baserow Dashboards overview + +Baserow Dashboards help you visualize and analyze your data through customizable widgets. Create visual representations of your metrics, monitor trends, and present information clearly to stakeholders. Dashboards automatically update when your data changes, ensuring you always see current information. + +This guide covers how to use Dashboards in Baserow to create insightful visualizations that meet your needs. + +![Baserow Dashboards][1] + +## What are dashboards? + +Dashboards are collections of visual widgets that display data from your Baserow tables. You can combine multiple widgets on a single dashboard to create comprehensive views of your data. Each widget connects to a data source and updates automatically when your underlying data changes. + +Dashboards work well for: +- Tracking key performance indicators (KPIs) across teams +- Monitoring project progress and milestones +- Analyzing sales trends and customer metrics +- Presenting data to stakeholders in meetings +- Creating reports that update in real-time + +Learn how to [create a new dashboard][2]. + +## Understanding widgets + +Widgets are the building blocks of dashboards that determine how your data is visualized. Each widget type serves a different purpose and works best with specific kinds of data. + +![Baserow Dashboard Widgets][3] + +### Summary widget + +The summary widget displays key metrics like totals, averages, and counts for quick insights at a glance. This widget is ideal when you need to highlight a single important number. + +The summary widget is best for displaying the total revenue or sales figures, number of active customers or projects, average order value or response time, or completion rates or success metrics + +### Bar chart widget + +The bar chart widget shows data as vertical or horizontal bars, perfect for comparing values across categories. You can add up to three series per chart to compare multiple metrics side by side. + +The bar chart widget is best for comparing performance across teams, products, or time periods, showing rankings or top performers, tracking changes over time with multiple data series, or visualizing survey results or categorical data + +### Line chart widget + +The line chart widget displays data as connected points over time, making it easy to spot trends and patterns. You can include up to three series per chart to compare multiple metrics simultaneously. + +The line chart widget is best for tracking metrics over time (daily, weekly, monthly), identifying trends and patterns in historical data, comparing growth rates across different categories, or monitoring changes and fluctuations + +### Pie chart widget + +The pie chart widget displays data as slices of a circle, where each slice represents a proportion of the whole. The size of each slice corresponds to its value, making it easy to see relative contributions at a glance. + +The pie chart widget is best for showing how parts make up a whole, displaying market share or budget allocation, visualizing distribution across categories (5-7 categories maximum), or presenting percentage breakdowns. + +### Doughnut chart widget + +The doughnut chart widget works like a pie chart but features a hollow center. This design creates a cleaner, more modern look while still showing proportions effectively. The center space can be used to display totals or additional context. + +The doughnut chart widget is best for modern, clean visualizations of proportions, showing part-to-whole relationships with visual emphasis, displaying percentages with room for central labels, or creating visually appealing dashboards. + +## Choosing the right widget + +| Widget Type | Best For | Data Type | Typical Use | +|-------------|----------|-----------|-------------| +| **Summary** | Single metrics | Numbers, counts, averages | KPIs, totals, key figures | +| **Bar Chart** | Comparisons | Categories with values | Rankings, team performance | +| **Line Chart** | Trends over time | Time series data | Growth, patterns, changes | +| **Pie Chart** | Proportions (few categories) | Percentages, shares | Distribution, allocation | +| **Doughnut Chart** | Proportions (modern style) | Percentages, shares | Status, breakdown, shares | + +## Customizing widgets + +Each widget can be customized to display exactly the information you need: + +**Title and description:** Give each widget a clear title and optional description to provide context for viewers. + +**Data source:** Connect each widget to a specific table or database. You can pull data from multiple sources across different databases on the same dashboard. + +**Grouping options:** Organize your data by specific fields to create categories or segments. For example, group sales by region or support tickets by priority. + +**Sorting preferences:** Control how data is ordered in your visualizations. Sort by value, alphabetically, or by custom criteria. + +**Color schemes:** Customize colors to match your brand or to highlight specific data points. + +## How dashboards update + +Dashboards automatically refresh when your Baserow tables change. This means: +- Add a new row, and it appears in your widgets immediately +- Update a value, and your charts reflect the change +- Delete data, and your visualizations adjust automatically + +This real-time updating ensures your dashboards always show current information without manual refreshes or recalculations. + +## Frequently asked questions + +### Can I combine data from multiple tables on one dashboard? + +Yes, you can add widgets from different tables and databases to the same dashboard. Each widget connects to its own data source, allowing you to create comprehensive views that pull from multiple locations. + +### Do dashboards update automatically? + +Dashboards refresh automatically when your underlying data changes. You don't need to manually refresh or recalculate widgets—they always show current information. + +### How many widgets can I add to a dashboard? + +There's no hard limit on widget count, but we recommend keeping dashboards focused. Too many widgets can make dashboards difficult to scan and understand. If you need to display many metrics, consider creating multiple dashboards organized by theme or department. + +### Can I control who sees my dashboards? + +Dashboard visibility follows Baserow's standard permission system. Users need appropriate access to the underlying databases and tables to view dashboard widgets. Learn more about [permissions in Baserow](/user-docs/permissions-overview). + +### What happens if I delete a table that's used in a dashboard widget? + +If you delete a table or database that a widget uses as its data source, the widget will show an error. You'll need to either restore the deleted data or remove the widget from your dashboard. + +## Related documentation + +- [Create custom views of your data](/user-docs/create-custom-views-of-your-data) - Learn about other ways to visualize data +- [Grid view](/user-docs/guide-to-grid-view) - Work with data in table format +- [Gallery view](/user-docs/guide-to-gallery-view) - Display data as cards +- [Permissions overview](/user-docs/permissions-overview) - Control dashboard access +- [Workspaces](/user-docs/intro-to-workspaces) - Organize your databases and dashboards + +--- + +**Need help?** Visit the [Baserow community](https://community.baserow.io) or [contact support](/contact) for assistance with dashboards. + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/d2af5b7b-94a3-4714-9f31-52a3fc13c2af/Dashboads(2).png + [2]: https://baserow.io/user-docs/create-a-dashboard + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/9af9799c-80c3-44fa-8c86-338f87689e42/Baserow%20Dashboards(2).png",,baserow_user_docs,https://baserow.io/user-docs/dashboards-overview +327,Create a dashboard,create-a-dashboard,Create a new dashboard in Baserow,"# Getting started with dashboards + +Baserow Dashboards allow you to transform data from your tables into dynamic, easy-to-read visualizations like bar charts and summary cards. They automatically update in real-time as your underlying data changes, making them perfect for monitoring key metrics and sharing insights. + +Baserow Dashboards transform your raw data into stunning, real-time visual insights, making it easy to monitor key metrics and share progress across your team. + +![Customize a Baserow Dashboard][1] + +## Overview of Baserow dashboards + +A **dashboard** in Baserow is a powerful, customizable display for visualizing and understanding your data. Instead of just looking at raw table entries, dashboards help you monitor project progress, analyze trends, and share actionable insights with your team. + +Dashboards are built using various **[widgets][2]**, which are the specific visualization blocks (e.g., bar charts, summary cards). Once created, your dashboard automatically updates whenever the underlying data in your Baserow tables changes, ensuring your visualizations always reflect the most current information. + +Before creating your first dashboard, ensure you're logged into your Baserow account and have access to the workspace where you want to build it. + +## How to create a new dashboard + +Follow these steps to create your first dashboard in any workspace: + +1. **Navigate to your workspace:** Go to the workspace where you want the new dashboard to live. +2. **Start creation:** Click the **+ Create new** button in the top-right corner of your workspace. +3. **Select dashboard:** A pop-up menu will appear. Select the **Dashboard** option from the list. +4. **Name your dashboard:** Give your dashboard a descriptive name that reflects its purpose (e.g., ""Q3 Sales Performance"" or ""Bug Tracker Status""). + +You will immediately be taken to the dashboard editor to begin adding [widgets][2]. + +![Create a Baserow Dashboard][3] + +## How to add and configure widgets + +[Widgets][2] are the building blocks of your dashboard. You can add multiple widgets to create a comprehensive view of your data. + +### Adding a widget + +1. In the dashboard editor, click the **Add widget** button. +2. Choose the type of widget you want to add (**Summary** or **Bar chart**). + +### Configuring widget settings + +After adding a widget, you'll configure its settings to define what data it visualizes and how it looks. + +1. **Title and description:** Enter a clear title and an optional description for the widget. +2. **Data source:** Select the Baserow database and table that contains the data you want to visualize. +3. **Grouping and sorting:** Use the available options to organize the data within the widget (e.g., group a bar chart by date or project status). + +### Chart widget-specific configuration + +For **Chart** widgets, you have additional control over the visualization style: + +| Setting | Description | Options | +| :--- | :--- | :--- | +| **Series type** | Determines the default appearance of the chart's data. | Bar chart (for categorical comparisons) or Line chart (for trend analysis). | +| **Multiple series** | Allows you to compare up to three different metrics or data sets on the same chart. | Up to three series can be added. | +| **Series style** | Overrides the main series type, allowing for mixed visualizations. | Each series can be independently configured as a bar or line. | + +![Add a widget][4] + +## Frequently asked questions (FAQ) + +### What types of widgets are available in a Baserow dashboard? + +Baserow dashboards currently offer **Summary** widgets, which display a single aggregated value, and **Bar chart** widgets for visual comparisons and trend analysis. + +### Can I connect a dashboard to multiple tables? + +Yes, each widget on a dashboard can be configured to pull data from a different Baserow table. This allows you to create a single, consolidated dashboard that summarizes data from various sources. + +### Does the dashboard update in real time? + +Yes. Baserow dashboards are designed to automatically update in real time whenever the underlying data in your connected Baserow tables changes. You do not need to manually refresh the dashboard. + +## Related content + +* [Dashboards overview](/user-docs/dashboards-overview) +* [Introduction to tables in Baserow](/user-docs/intro-to-tables) +* [Overview of Baserow views](/user-docs/overview-of-baserow-views) + +*** + +Still need help? If you’re looking for something else, please feel free to make recommendations or ask us questions; we’re ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io/) +- [Contact support](https://api.baserow.io/contact) for questions about Baserow or help with your account + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/9e324277-d6f8-4632-888c-50f791936620/Settings.png + [2]: https://baserow.io/user-docs/dashboards-overview + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/e73b6055-ba76-459b-a51c-ec25bbccf302/create.png + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/02403839-efc7-4bcb-935b-01b2e426d442/Add%20a%20Widget.png",,baserow_user_docs,https://baserow.io/user-docs/create-a-dashboard +328,Menu element,menu-element,Menu element in Baserow Application Builder,"## Overview of the Menu element + +The Menu element is a powerful navigation component in the Application Builder that helps users move through different parts of your application smoothly. It creates an organized structure that makes navigation intuitive and efficient. + +You can configure the Menu element's properties, style, and functionality through the element settings. + +## Add and configure Menu elements + +Adding a Menu element to your application is straightforward through the elements panel. + +1. Open the **Elements** panel from the top bar +2. Select the **Menu** element +3. Configure menu items and styling through the properties panel + +### Menu Styling Options + +The Menu element offers two main styling approaches: + +- **Button style:** Creates a button-like menu that's prominent and easy to click. Ideal for primary navigation options. +- **Link style:** Provides a more subtle, text-based navigation approach. Perfect for secondary navigation or when space is limited.",,baserow_user_docs,https://baserow.io/user-docs/menu-element +359,Rating element,application-builder-rating-element,Rating element in Baserow Application Builder,"# Application Builder - Rating element + +The Rating element allows users to display, collect, and view ratings in your application. Rating elements provide visual feedback through star, heart, or numeric representations, making them ideal for collecting user feedback or displaying evaluation scores. + +In this section, we'll guide you through setting up different rating elements and explain each configuration option in detail. + +## Overview + +Baserow offers three different rating element types to serve various purposes in your application: + +1. **Rating**: Shows a static rating value represented by stars, hearts, or numbers. This is useful for displaying pre-existing ratings from your data source. +2. **Rating Input**: Allows users to provide ratings that can be stored in your database. Perfect for collecting user feedback or reviews. +3. **Rating Column**: Integrates within table elements to display rating values alongside other data in a structured format. + +For all rating element types, you can configure the element properties and [style](/user-docs/element-style) from the element settings panel. + +## Add and configure rating elements + +To add a rating element, access the [elements panel](/user-docs/elements-overview) and select **Rating** or **Rating input**. + +Once added, place the rating element wherever you want it on the [page](/user-docs/pages-in-the-application-builder). Don't worry if it's not perfectly positioned initially; you can always move it later. + +> Learn more about how to [add and remove an element from a page](/user-docs/add-and-remove-elements). + +Now, you'll configure the rating element's properties to make it function and look the way you want. + +## Rating element + +The Rating element is perfect for showing existing ratings from your data sources. It's a read-only element that visualizes numeric values as ratings. + +### Configuration options + + **Rating value**: Set the value to display. This can be: + - A static numeric value between 0 and 10 + - A field from a connected [data source](/user-docs/data-sources) +
+ **Maximum rating**: Define the maximum possible rating value, which determines the number of rating symbols displayed (between 1 and 10). +
+**Style**: Select the visual representation of your ratings: + - Stars + - Hearts + - Thumbs up + - Flags + - Smiles +
+ - **Symbol color**: Customize the color of filled symbols using: + - Hexadecimal color code + - RGB value + - Color picker + - Primary/Secondary/Border/Success/Warning/Error + +## Rating Input element + +The Rating Input element allows users to provide ratings by clicking or tapping on rating symbols. This interactive element is perfect for forms and feedback collection. + +### Configuration options + +In addition to the display options available in the Display Rating element, the Rating Input includes these additional settings: + +- **Label**: Add descriptive text above the rating input to guide users. + +- **Default value**: Set a pre-selected rating that appears when the page loads. + +- **Required**: When enabled, users must provide a rating before form submission. + + +## Rating Column in Table elements + +When configuring a table element, you can display rating values as one of the column types. This integrates seamlessly with your tabular data. + +### Configuration steps + +1. Add a [table element](/user-docs/application-builder-table-element) to your page +2. In the table's field configuration, add a new field or edit an existing one +3. Set the field type to **Rating** +4. Configure the value mapping to the data source field containing rating values +5. Adjust the rating display settings to match your needs +
+## Working with Rating data +
+### Connecting to data sources + +The Application Builder allows you to bind rating elements to [data sources](/user-docs/data-sources). This enables: + +- Display Rating elements to show values from your database +- Rating Input elements to store user ratings back to your database +- Dynamic rating displays that update when data changes + +### Using Rating elements with workflows + +Rating Input elements work particularly well with workflow actions: + +- Collect user feedback and store it in database tables +- Create satisfaction surveys with multiple rating inputs +- Update existing ratings based on user input + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we're ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account",,baserow_user_docs,https://baserow.io/user-docs/application-builder-rating-element +360,File input element,application-builder-file-input-element,File input element in Baserow Application Builder,"# Application Builder - File Input element + +The File Input element enables users to upload files directly through your application. This enterprise/advanced feature enhances data collection capabilities by allowing end users to submit files that can be stored in your Baserow tables. + +In this section, we'll guide you through setting up a file input element and explain each configuration option in detail. + +## Overview + +For the file input element, you can configure the element properties and [style](/user-docs/element-style) from the element settings panel on the right side of the screen. + +The File Input element is particularly useful when combined with workflow actions to create or update rows in your database, with the uploaded files stored in ""File"" type fields. + +## Add and configure file input elements + +To add a file input element, access the [elements panel](/user-docs/elements-overview) and select **File Input**. + +Once added, place the file input wherever you want it on the [page](/user-docs/pages-in-the-application-builder). Don't worry if it's not perfectly positioned initially; you can always move it later. + +> Learn more about how to [add and remove an element from a page](/user-docs/add-and-remove-elements). + +Now, you'll customize the file input's behavior and appearance by configuring its properties. + +## File Input configuration options + +### General settings + + - **Label**: Add a descriptive text that appears above the file input to guide users on what files to upload. + + - **Help text**: Provide additional context or instructions inside the button to assist users with file selection. *Leaving this empty will result in the default text Drag and drop files here or click to select* + + - **Required**: When enabled, users must upload at least one file before form submission is allowed. + + - **Multiple files?**: Enable this to allow the user to upload more than one file. + + - **Initial file URL?**: Shows an example file underneath the input. + + - **Initial file name?**: Gives the example file a title. + +### File restrictions + + - **Allow multiple files**: Toggle this option to allow users to upload one or multiple files within a single file input element. + + - **Maximum files**: Define how many files users can upload (when multiple files are allowed). This setting helps prevent excessive uploads. + + - **Maximum file size**: Set the maximum allowed size for each uploaded file (in MB). This helps control storage usage and prevents extremely large file uploads. + + - **Preview images?**: Will generate a small preview of the file if it is an image file format. + +## Working with uploaded files + +### Using with workflow actions + +The File Input element works seamlessly with workflow actions to store uploaded files in your database: + +1. **Create Row action**: Include the uploaded file in a new database record +2. **Update Row action**: Add or replace files in an existing record +3. **Form Submit action**: Process multiple inputs including file uploads + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions—we're ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account",,baserow_user_docs,https://baserow.io/user-docs/application-builder-file-input-element +361,MCP Server,mcp-server,Baserow MCP Server overview,"# MCP Server in Baserow + +Baserow's Model Context Protocol (MCP) Server lets you connect Large Language Models like Claude, Cursor, or Windsurf directly to your workspace. You can create, read, update, and delete data using natural language prompts without writing code or API calls. + +## What is MCP Server in Baserow? + +MCP Server makes it easy to manage Baserow data through AI assistants in less time than manual database operations. + +The Model Context Protocol (MCP) Server provides seamless integration between Baserow and Large Language Models. Once configured, you can interact with your Baserow databases using conversational commands through supported LLM clients like Claude Desktop, Cursor, or Windsurf. + +![Integrate Baserow with LLMs using the Model Context Protocol (MCP) Server][1] + +### How it works + +Each MCP server endpoint generates a unique URL that grants your chosen LLM secure access to your workspace. The LLM can then perform database operations on your behalf by interpreting natural language requests and translating them into Baserow actions. + +**Use cases:** +- Query databases without writing SQL or formulas +- Bulk update records through conversational commands +- Generate reports by asking questions in plain English +- Automate data entry workflows using AI assistance + +## Supported operations + +The MCP server supports all standard CRUD operations through natural language prompts. We recommend using high-parameter models for optimal performance. + +| Operation | Description | Example Prompt | +|-----------|-------------|----------------| +| **Create** | Add new records to tables | ""Add a new task called 'Review Documentation' with priority set to High"" | +| **Read** | Query and retrieve existing data | ""Find all projects due this week and show their status"" | +| **Update** | Modify existing records | ""Change the status of task #47 to 'In Progress'"" | +| **Delete** | Remove records from tables | ""Delete all completed tasks that are older than 30 days"" | + +## Setting up the MCP Server + +### Prerequisites +- An active Baserow workspace +- A supported LLM client installed (Claude Desktop, Cursor, or Windsurf) +- Admin or appropriate workspace permissions + +### Step-by-step setup + +**1. Access MCP settings** +- Click your workspace name in the top navigation bar +- Select **My Settings** from the dropdown menu +- Navigate to the **MCP Server** tab + +**2. Create an endpoint** +- Click **Create Endpoint** +- Enter a descriptive name (e.g., ""Marketing Database Assistant"") +- Select the workspace you want to connect to, then create the endpoint. + +**3. Choose your LLM client** +After you create the endpoint, click **More Details** to view configuration options +Select from the available options: +- Claude +- Cursor +- Windsurf + +**4. Copy your MCP URL** +Baserow will generate a unique endpoint URL. **Treat this URL as a password**; it grants full access to modify data in your workspace. + +**5. Configure your LLM client** +Follow the specific configuration instructions for your chosen LLM (detailed in sections below) + +## Configure your LLM client + +### Claude Desktop + + 1. Open Claude Desktop settings (⌘+, on Mac) + 2. Navigate to the **Develop** tab + 3. Click **Edit Config** to open `claude_desktop_config.json` + 4. Add the JSON configuration below + +``` +{ + ""mcpServers"": { + ""Baserow MCP"": { + ""command"": ""npx"", + ""args"": [ + ""mcp-remote"", + ""YOUR_MCP_URL_HERE"" + ] + } + } +} +``` + +### Cursor + +1. Open Cursor settings (⇧+⌘+J on Mac) +2. Navigate to the **MCP** tab +3. Click **Add MCP Server** +4. Paste the JSON configuration + +``` +{ + ""mcpServers"": { + ""Baserow MCP"": { + ""url"": ""YOUR_MCP_URL_HERE"" + } + } +} +``` + +### Windsurf + +1. Open Windsurf Settings → **Advanced Settings** (or use Command Palette → ""Open Windsurf settings page"") +2. Scroll to the **Cascade** section +3. Click to add a new server or view the raw JSON config file at `mcp_config.json` +4. Add the JSON configuration + +```json +{ + ""mcpServers"": { + ""Baserow MCP"": { + ""serverUrl"": ""YOUR_MCP_URL_HERE"" + } + } +} +``` + +> Replace `YOUR_MCP_URL_HERE` with the MCP URL copied from your Baserow settings. + + +## Security best practices + +⚠️ **Critical security note:** Your MCP URL contains credentials that grant full access to your workspace data. + +**Do:** +- Store your MCP URL securely like a password +- Revoke and regenerate URLs if compromised +- Use descriptive endpoint names to track usage +- Create separate endpoints for different use cases + +**Don't:** +- Share your MCP URL publicly or in version control +- Store it in unsecured locations +- Use the same endpoint across multiple team members +- Post screenshots containing the full URL + +## Frequently asked questions + +### What LLMs are compatible with Baserow's MCP Server? + +Currently, Baserow's MCP Server works with Claude Desktop, Cursor, and Windsurf. Any client that supports the Model Context Protocol specification can potentially connect to Baserow using the MCP endpoint. + +### Can I create multiple MCP endpoints for different purposes? + +Yes, you can create multiple endpoints within the same workspace. This is useful for organizing access by project, team member, or use case. Each endpoint gets a unique URL with independent access controls. + +### What happens if my MCP URL is exposed? + +If your MCP URL is compromised, immediately delete the endpoint in your Baserow MCP settings and create a new one. The old URL will no longer function, preventing unauthorized access to your workspace. + +### Do I need programming knowledge to use MCP Server? + +No programming required. The MCP Server translates natural language prompts into database operations, making it accessible to non-technical users who can describe what they need in plain English. + +### What are the limitations of using AI to manage database operations? + +While powerful, AI interpretations depend on model quality and prompt clarity. Always verify critical operations, especially bulk updates or deletions. We recommend using high-parameter models and reviewing actions before confirming destructive changes. + +## Related content + +- [Database API documentation](/user-docs/database-api) - Learn about direct API access +- [Webhooks](/user-docs/webhooks) - Automate workflows with webhooks +- [Database token](/user-docs/personal-api-tokens) - Manage API authentication +- [Working with collaborators in Baserow](/user-docs/managing-workspace-collaborators) - Team access management +- [Permissions overview](/user-docs/permissions-overview) - Understanding workspace security + +--- + +**Still need help?** If you have questions about MCP Server setup or usage, visit the [Baserow community](https://community.baserow.io) or [contact support](/contact). + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/d5d74fe1-99e2-4bb6-80bf-993c7b177dfa/MCP%20server.png",,baserow_user_docs,https://baserow.io/user-docs/mcp-server +362,Field permissions,field-level-permissions,Field level permissions in Baserow table,"# Field-level permissions + +Field-level permissions work alongside Baserow's role hierarchy (workspace → database → table) as an additional security layer. Members who can access a table may still be restricted from editing certain fields based on their role level. + +This guide covers how to control who can edit specific fields within tables, protect sensitive columns like salary or SSN, and implement the most granular permission control available in Baserow. + +> **Paid feature:** Role-based permissions are available on Baserow Advanced and Enterprise plans. [View pricing details](https://baserow.io/pricing). + +## Overview + +Field-level permissions let you restrict editing of individual columns within a table—protecting sensitive fields like salary, SSN, or performance ratings while allowing broader table access for other data. + +Unlike table-level permissions that control access to entire tables, field-level permissions provide column-by-column control. This is Baserow's most granular permission layer, operating within table-level access to fine-tune who can modify specific data fields. + +![Field-level permissions interface](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/c328f77e-494b-4d92-8aa6-730d62b6a7eb/Field%20permissions.png) + + + +## When to use field-level permissions + +### Field-level vs. other permission levels + +| Permission Level | Granularity | Use When | +|-----------------|-------------|----------| +| **Workspace roles** | All content | Setting org-wide defaults | +| **Database roles** | All tables in database | Creating department boundaries | +| **Table roles** | All fields in table | Protecting entire tables | +| **Field permissions** | Individual columns | **Protecting specific columns within accessible tables** | + +### Common use cases + +| Scenario | Implementation | Why Field-Level Works | +|----------|----------------|----------------------| +| **Salary data** | Employee table accessible, Salary field Admin-only | HR needs other employee data, only executives see salary | +| **Social Security Numbers** | Customer table editable, SSN field Admin-only | Sales team edits customer info, can't modify SSN | +| **Performance ratings** | Review table accessible, Rating field Builder+ | Reviewers enter data, only managers edit final ratings | +| **Audit timestamps** | Any table, Created/Modified fields Read-only | Everyone sees when changes happened, no one can alter timestamps | +| **Calculated fields** | Financial table, Formula fields Read-only | Team views calculations, formulas protected from accidental changes | +| **Configuration settings** | Settings table, API Keys field Admin-only | Developers see other settings, can't edit production keys | + +### Field-level vs. hiding fields + +| Feature | Purpose | Visibility | Editing | +|---------|---------|------------|---------| +| **Field-level permissions** | Control who can EDIT | Everyone can see | Restricted by role | +| **Hide fields (view settings)** | Control who can SEE | Hidden from view | N/A if hidden | + +You can use field-level permissions when everyone should see the data, but only specific roles should edit it, and you need an audit trail of who can modify the data. + +Hide fields when the data shouldn't be visible at all, to simplify the interface for certain users, and to create role-specific views. + +You can **combine both**: hide the field in certain views and restrict editing via field permissions. + + +## How field-level permissions work + +### Permission hierarchy within tables + +Field permissions operate as a **fourth layer** on top of table access: + +``` +1. Workspace Role (baseline) + ↓ +2. Database Role (dept/project override) + ↓ +3. Table Role (table access) + ↓ +4. Field Permissions (column editing restrictions) +``` + +> Field permissions only matter if the member can access the table. + +**Example:** Marketing Team has **Editor** role on Customers Table. Customer SSN field set to **Admin-only** editing. Marketing can edit customer data, but cannot edit the SSN field (view only) + +### Permission levels + +| Level | Who Can Edit | Common Use Cases | +|-------|-------------|------------------| +| **Admins only** | Workspace/database/table admins | Ultra-sensitive data: salary, SSN, legal documents | +| **Builders and higher** | Builders + Admins | Structural data: formulas, configurations, system settings | +| **Editors and higher** | Editors + Builders + Admins | Standard collaborative data (default) | +| **Nobody (Read-only)** | No one can edit | Calculated fields, audit timestamps, imported historical data | + +![Field permission levels](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/093a077f-274a-4754-bd0f-3eb5a6049417/field_level_permissions.png) + +### Interaction with table roles + +Field permissions **refine** table-level access, they don't replace it: + +| Table Role | Field Permission | Effective Access | +|------------|------------------|------------------| +| **Editor** | Editors and higher | ✓ Can edit field | +| **Editor** | Builders and higher | ✗ Can view, cannot edit | +| **Editor** | Admins only | ✗ Can view, cannot edit | +| **Viewer** | Editors and higher | ✗ Can view, cannot edit (Viewer can't edit anything) | +| **Commenter** | Editors and higher | ✗ Can view, cannot edit (Commenter can't edit data) | +| **Admin** | Admins only | ✓ Can edit field | + +> Field permissions can only restrict editing further; they can't grant editing to roles that can't edit the table. + + + +## Set field-level permissions + +1. Navigate to your table to access field permission settings +2. Locate the field you want to protect +3. Click the **dropdown arrow** next to the field name in the header +4. Select **Field options** +5. Click the **Permissions** tab to configure the permission level and choose the appropriate restriction: +6. Click **Save** to apply the permission +7. Icon appears next to the field name, indicating restricted editing +8. Test with different role accounts to verify behavior + +> Users see a lock icon or visual indicator on fields they cannot edit, making permissions transparent. + + +## Advanced field permission strategies + +### Strategy 1: Progressive data refinement workflow + +Data moves through approval stages with increasing restrictions. Content publishing workflow, Clear workflow with each stage protected appropriately. + +**Implementation:** +1. Draft field: **Editors and higher** (team creates content) +2. Review Notes field: **Builders and higher** (managers review) +3. Approved field: **Admins only** (executives approve) +4. Published Date field: **Read-only** (system-generated, no edits) + + +### Strategy 2: Sensitive columns in shared tables + +Share most data, protect specific sensitive columns. Employee directory with sensitive info, Company directory accessible to all, sensitive fields locked down. + +**Implementation:** +- Table access: All staff → **Viewer** on Employees table +- Name, Email, Department fields: **Editors and higher** (HR updates) +- Salary field: **Admins only** (CFO access) +- SSN field: **Admins only** (HR Director only) +- Performance Rating field: **Builders and higher** (Managers) + +### Strategy 3: Configuration tables with secrets + +Developers see settings, can't modify production secrets. Application configuration database, Developers work with configs safely, production secrets protected. + +**Implementation:** +- Table access: Dev Team → **Editor** on Config table +- Environment field: **Editors and higher** (dev/staging/prod indicator) +- API Endpoint field: **Builders and higher** (senior devs config) +- API Secret Key field: **Admins only** (DevOps lead only) +- Last Modified field: **Read-only** (audit trail) + +### Strategy 4: Audit-compliant data entry + +Meet compliance requirements for financial data. Financial transactions table, Clear audit trail with tamper-proof timestamps. + +**Implementation:** +- Table access: Finance Team → **Editor** +- Transaction Amount field: **Editors and higher** (team enters) +- Approved By field: **Builders and higher** (managers approve) +- Audit Status field: **Admins only** (auditors mark reviewed) +- Created On, Modified On fields: **Read-only** (tamper-proof) + +### Strategy 5: Client data with PII protection + +GDPR/HIPAA compliance for personal data. Customer relationship management, Compliance-ready customer data management + +**Implementation:** +- Table access: Sales Team → **Editor** on Customers table +- Name, Company, Email fields: **Editors and higher** +- Phone Number field: **Builders and higher** (managers verify) +- SSN, Tax ID fields: **Admins only** (legal team only) +- Medical Notes field: **Admins only** (healthcare team only) +- Consent Date field: **Read-only** (legal requirement) + +## Field permissions in forms + +When using Baserow forms, field-level permissions affect which fields can be set during form submission: + +- Fields with **Editors and higher**: ✓ Can be included in forms +- Fields with **Builders and higher**: ✗ Cannot be set via form submission +- Fields with **Admins only**: ✗ Cannot be set via form submission +- Fields with **Read-only**: ✗ Cannot be set via form submission + +**Use case:** Public form for lead generation where form submitters can fill basic info, but internal ratings/scores can only be added by staff after review. + +**To configure form submission restrictions:** +1. Set field permission level in table settings +2. The field automatically becomes unavailable in the form designer for restricted permissions +3. Form submitters can only fill fields they have permission to edit + +Learn more about [creating forms](/user-docs/guide-to-creating-forms-in-baserow). + + +## Field permissions and API access + +### API respects field permissions + +Field-level permissions apply to **both web interface and API requests**. API reads always return field data (if table access exists), API writes respect field permission levels. Attempting to edit a restricted field via API returns a permission error. + +**Example API response:** +```json +{ + ""error"": ""ERROR_FIELD_NOT_EDITABLE"", + ""detail"": ""User does not have permission to edit this field"" +} +``` + +> **Best practice:** Test API integrations with different role accounts to ensure field permissions work as expected. + +Learn more about [Baserow API](/user-docs/database-api). + +## Troubleshooting field permissions + +### ""Users can't edit expected fields"" + +It is possibly because the field permission is too restrictive for the user's role, the user's table role doesn't allow editing (Viewer, Commenter), or workspace/database role overrides are causing confusion + +Check field permission setting (Field Options → Permissions), verify user's role at the table level (must be Editor or higher to edit any field), and confirm user's effective role considering workspace → database → table hierarchy + +### ""Field permission changes not applying"" + +This is because browser cache or session issue. Refresh the page (hard refresh: Cmd/Ctrl + Shift + R), clear browser cache, log out and log back in, and try a different browser to isolate the issue + +### ""Admin can't edit field despite Admin role"" + +This is because the field is set to ""Read-only"" (Nobody). ""Read-only"" fields cannot be manually edited by anyone, including admins. This is intentional for calculated fields, formulas, and system-generated data. Change the field permission to ""Admins only"" if manual editing should be allowed for admins. + +### ""Permissions working in web but not in API"" + +API should respect field permissions. Verify API token has correct permissions, check if using database token vs. user token, and contact support if API permissions aren't matching web behavior + + +## Frequently asked questions + +### Can I set different view permissions and edit permissions for the same field? + +Yes. You can hide a field in specific views (view-level setting) while still restricting who can edit it via field-level permissions. These are independent settings that work together. + +### Do field-level permissions affect calculated fields and formulas? + +Read-only permission is automatically applied to formula fields since they can't be manually edited. You can also set formula fields to other permission levels if you want to control who can modify the formula itself. + +### Can I bulk-edit field permissions across multiple fields? + +No. Field permissions must be set individually for each field. This ensures intentional, careful permission assignment for sensitive data. + +### What happens to existing data when I change field permissions? + +Data remains unchanged. Field permissions only affect future editing capabilities—they don't modify, hide, or delete existing field values. + +### Can I see who last edited a restricted field? + +Yes, if you have row change history enabled. Row change history tracks all edits, including which user modified which fields. Learn more about [row change history](/user-docs/row-change-history). + +### Do field permissions work with linked records? + +Yes. If a field links to another table (Link to table field), field permissions control whether users can modify which records are linked. The permissions on the linked table determine access to the actual linked records. + +### Can external form submitters edit restricted fields? + +No. Form submissions respect field-level permissions. Restricted fields cannot be set via form submission, only by users with appropriate roles editing directly in the table. + + +## Related content + +**Permission system:** +- [Understanding role hierarchy](/user-docs/role-based-access-control-rbac) +- [Role capabilities reference](/user-docs/set-permission-level) +- [Assign roles at table level](/user-docs/assign-roles-at-table-level) + +**Field management:** +- [Field configuration options](/user-docs/field-customization) +- [Hide and show fields](/user-docs/field-customization) +- [Formula field overview](/user-docs/formula-field-overview) + +**Data security:** +- [Row change history](/user-docs/row-change-history) +- [Audit logs](/user-docs/admin-panel-audit-logs) +- [Permissions overview](/user-docs/permissions-overview) + +**Forms and API:** +- [Creating forms in Baserow](/user-docs/guide-to-creating-forms-in-baserow) +- [Database API documentation](/user-docs/database-api) + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account",,baserow_user_docs,https://baserow.io/user-docs/field-level-permissions +392,Field indexes,field-indexes,Field indexes in Baserow,"# Field indexes in Baserow + +Field indexes in Baserow transform slow queries into lightning-fast operations; reducing filter and search times by up to 80% on large tables by creating optimized data structures that accelerate lookups without changing your table structure. + +This guide explains how to use field indexes to dramatically improve query performance by speeding up filter operations and API requests on large tables. + + + +![Field indexes in Baserow](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/2ef7dfc3-0962-4049-b11d-37aabba395b6/Field%20indexes.png) + +## Overview + +Field indexes are database optimization structures that improve query performance by creating organized reference tables for specific fields. Think of an index like a book's index; instead of scanning every page to find a topic, you look up the page number instantly in the alphabetized index at the back. + +When you create an index on a field, Baserow builds and maintains a sorted, searchable structure that allows filters, searches, and API queries to locate matching rows orders of magnitude faster than scanning the entire table. This optimization becomes critical as tables grow beyond a few thousand rows, where unindexed queries can take seconds or minutes while indexed queries complete in milliseconds. + +Indexes work best on fields you frequently use in filters or API queries; fields like customer ID, status, date ranges, or category selectors. However, indexes come with trade-offs: they consume additional storage space and slightly slow down row creation and updates as Baserow maintains the index structure alongside your data. + + +## How to add a field index + +Enable indexing on any supported field through the field configuration menu. + +**To create an index:** + +1. Navigate to the table containing the field you want to optimize +2. Click the **dropdown arrow** next to the field name +3. Select **Edit field** from the menu +4. Click the **Advanced** tab in the field editor +5. Toggle the **Index** option to enable indexing +6. Click **Save** to apply the change + +![Enabling field index in advanced settings](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/2ef7dfc3-0962-4049-b11d-37aabba395b6/Field%20indexes.png) + +Baserow immediately begins building the index in the background. Small tables index within seconds, while large tables (100K+ rows) may take minutes to complete initial indexing. During this time, queries continue working normally; they simply don't benefit from the index until building completes. + +**Index maintenance:** After creation, Baserow automatically maintains the index as you add, edit, or delete rows. This maintenance happens transparently without manual intervention, though it adds slight overhead to write operations. + +**To remove an index:** Follow the same steps and toggle the Index option off. Baserow removes the index structure, freeing storage space and eliminating write overhead. + +## Supported field types for indexing + +Not all field types support indexing. If a field type doesn't support indexing but you frequently filter by it, consider creating a formula or lookup field that references it and index that field instead (if the result type supports indexing). + +Here's what can be indexed: + +| Field type | Indexing support | Best use cases | +|------------|-----------------|----------------| +| **Single line text** | ✅ Supported | Customer names, IDs, SKUs, codes | +| **Long text** | ✅ Supported | Search optimization, descriptions | +| **Number** | ✅ Supported | Order numbers, quantities, prices | +| **Date** | ✅ Supported | Date range filters, timeline queries | +| **Computed field** | ✅ Supported | Count, Rollup, Lookup | +| **Boolean** | ⚠️ Limited benefit | Low cardinality; usually not needed | +| **Single select** | ❌ Not supported | Cannot index status, category, priority filters | +| **Email** | ❌ Not supported | Cannot index customer lookups, user searches | +| **URL** | ❌ Not supported | Cannot index link filtering, domain searches | +| **Phone number** | ❌ Not supported | Cannot index contact searches, lookups | +| **Multiple select** | ❌ Not supported | Cannot index multi-value fields | +| **Link to table** | ❌ Not supported | Use indexes on looked-up fields instead | +| **File** | ❌ Not supported | Cannot index attachment fields | +| **Duration** | ❌ Not supported | Index date fields instead | + +## Using field indexes + +Indexes work best alongside other optimizations: efficient [filters][6], [views][view-custom] focused on specific data subsets, and [API queries][100] structured to leverage indexed fields. + +### When to use field indexes + +**Large table filtering:** Tables with 10,000+ rows where filters take multiple seconds to apply benefit significantly from indexes on filtered fields. + +**API query optimization:** Applications making frequent API queries filtering by specific fields (customer ID, order number, status) see dramatic performance improvements. + +**High-volume searching:** Fields used in search operations or ""contains"" filters speed up when indexed, especially with text fields. + +**Dashboard and reporting:** Views that filter or sort by specific fields load faster when those fields are indexed, improving user experience. + +**Integration performance:** Webhooks, automations, and integrations querying your table benefit from indexes on their query fields. + +### When NOT to use field indexes + +**Small tables:** Tables under 1,000 rows typically don't benefit from indexes; the overhead outweighs the gains. + +**Rarely queried fields:** Fields never or rarely used in filters waste storage space if indexed. + +**High write-frequency fields:** Fields updated constantly incur performance penalties maintaining indexes; avoid indexing frequently-changing fields unless read performance is critical. + +**Storage-constrained environments:** Indexes consume additional database storage; avoid over-indexing when storage is limited. + +**Fields with few unique values:** Boolean provides minimal index benefits since most optimizations work well on low-cardinality fields without indexes. + +> Performance gains vary based on table size, hardware, query complexity, and field data distribution. Larger tables and more selective filters show greater improvements. + + +## API optimization strategy + +Field indexes improve [API][100] query performance, especially for filtered requests. + +1. Identify fields commonly used in API filter parameters +2. Enable indexes on those fields +3. Structure API queries to leverage indexed fields +4. Monitor API response times and adjust indexing strategy + +## Frequently asked questions + +### How do I know if my table needs indexes? + +If filter operations take more than 2-3 seconds on tables with 5,000+ rows, or if API queries feel sluggish, indexes likely help. Monitor query performance in browser developer tools; if you see long wait times when applying filters, index the filtered fields. + +### Can I index multiple fields in the same table? + +Yes, you can create multiple indexes per table, though each adds storage overhead and write performance impact. Focus on your 3-5 most-queried fields first, then add more indexes only if performance measurements justify them. + +### Do indexes automatically update when I change data? + +Yes, Baserow maintains indexes automatically as you add, edit, or delete rows. You never need to manually rebuild or refresh indexes; they stay synchronized with your data transparently in the background. + +### Why isn't the Index option available for my field? + +Some field types don't support indexing. See the [supported field types](#supported-field-types-for-indexing) section for the complete list. + +### Do indexes affect other users' views or queries? + +No, indexes are table-level optimizations that improve performance for all users querying that table, not just you. When you enable an index, everyone benefits from faster filters and searches on that field across all views. + +### What happens to indexes when I export or duplicate a table? + +Indexes don't export with data in CSV/Excel; they're database structures, not data. When duplicating tables within Baserow, index configurations copy to the new table. When importing external data, you'll need to recreate indexes manually on the new table. + +## Related content + +- [Field configuration options][field-config] - Access index settings through field editor +- [Filtering in Baserow][6] - Optimize filters with indexed fields +- [API documentation][100] - Leverage indexes in API queries +- [Grid View guide][22] - Understand view performance and optimization +- [Database performance][perf] - Additional optimization strategies +- [Field types overview][field-types] - Learn which fields support indexing + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + +[6]: /user-docs/filters-in-baserow +[22]: /user-docs/guide-to-grid-view +[100]: /user-docs/database-api +[field-config]: /user-docs/field-customization +[field-types]: /user-docs/baserow-field-overview +[view-custom]: /user-docs/view-customization +[perf]: /user-docs/database-performance",,baserow_user_docs,https://baserow.io/user-docs/field-indexes +393,Field value constraints,field-value-constraints,Baserow Field value constraints,"# Field value constraints in Baserow + +Field value constraints in Baserow prevent bad data at the source; enforcing uniqueness, required values, and validation rules automatically so your database stays clean without manual checking or post-entry cleanup. + +This guide explains how to use field value constraints to enforce data quality rules, prevent duplicate entries, and maintain database integrity through automatic validation. + +![Field value constraints in Baserow](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/550ddde3-1604-4aa8-962e-b948a173d8c3/Field%20constraints.png) + +## Overview + +Field value constraints are data quality rules that Baserow enforces automatically when users create or update rows. By defining constraints at the field level, you prevent invalid data from entering your database in the first place, eliminating the need for data cleanup, duplicate detection, or manual validation after the fact. + +Constraints work like database guardrails; they block operations that would violate your rules and provide immediate feedback to users explaining why the data wasn't accepted. This real-time validation ensures data integrity across all entry methods: manual entry in Grid View, form submissions, API calls, CSV imports, and automation workflows. + +## Why use field value constraints + +**Prevent duplicate records:** Enforce unique customer IDs, email addresses, or order numbers to avoid confusion and maintain referential integrity. + +**Data quality assurance:** Block invalid entries at creation time rather than discovering and fixing problems later through manual review. + +**Regulatory compliance:** Meet data standards requiring unique identifiers, non-duplicate records, or validated field values for auditing purposes. + +**Integration reliability:** Ensure external systems receive clean, consistent data through APIs by validating at the database layer. + +**User guidance:** Provide immediate feedback when users attempt invalid entries, teaching correct data entry patterns through enforcement. + +**Reduce manual cleanup:** Eliminate hours spent finding and merging duplicate records by preventing duplicates from being created initially. + +## How to add a field constraint + +Configure constraints through the field's advanced settings in the field editor. + +**To add a unique constraint:** + +1. Navigate to the table containing the field you want to constrain +2. Click the **dropdown arrow** next to the field name +3. Select **Edit field** from the menu +4. Click the **Advanced** tab in the field editor +5. In the **Constraints** section, select your constraint type +6. Click **Save** to apply the constraint + +![Setting field value constraint in advanced settings](https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/550ddde3-1604-4aa8-962e-b948a173d8c3/Field%20constraints.png) + +Constraints apply immediately after saving. Baserow validates existing data; if current rows violate the new constraint, you'll receive an error and must fix duplicates before enabling the constraint. + +**To remove a constraint:** Follow the same steps and click the **trash icon**, then save. Existing data remains unchanged, and duplicate entries become possible again. + +## Available constraint types + + +| Constraint | Enforces | Use cases | +|------------|----------|-----------| +| **Unique with empty** | No duplicates, but empty values permitted | Optional unique fields like secondary email, alternate phone | + +> Currently, Baserow supports unique constraints that prevent duplicate values in a field. Additional constraint types (required values, format validation, range limits) are under development and will be released in future updates, expanding data quality controls across your database. + + +## How constraints work + +### Unique with empty constraint + +This constraint prevents duplicate values but permits multiple rows to have empty values in the field. Only populated values must be unique. + +**Behavior:** +- ✅ Accepts: New unique values not present in any other row +- ✅ Accepts: Empty/blank values (multiple rows can be empty) +- ❌ Rejects: Non-empty values that already exist in another row + +## Supported field types for constraints + +Not all field types support constraints. Here's what can be constrained: + +| Field type | Unique constraint | Notes | +|------------|------------------|-------| +| **Single line text** | ✅ Supported | IDs, codes, usernames, SKUs | +| **Long text** | ✅ Supported | Descriptions, notes (rarely used) | +| **Number, Rating, Duration** | ✅ Supported | Order numbers, account numbers | +| **Email** | ✅ Supported | User emails, contact emails | +| **URL** | ✅ Supported | Website URLs, profile links | +| **Date** | ✅ Supported | Unique dates (rare use case) | +| **Single select** | ⚠️ Limited utility | Few options = duplicates needed | +| **Phone number** | ❌ Not supported | Cannot constrain contact numbers, support lines | +| **Boolean** | ❌ Not useful | Only 2 values possible | +| **Multiple select** | ❌ Not supported | Cannot constrain multi-value fields | +| **Link to table** | ❌ Not supported | Relationships handled differently | +| **File** | ❌ Not supported | Cannot constrain attachments | +| **Formula, Last modified, Created on, Last modified by, Created by** | ❌ Not supported | Computed values, not direct entry | +| **Lookup, Count, Rollup, Collaborators** | ❌ Not supported | Retrieved values, not direct entry | + +> **Best practice:** Apply unique constraints to fields designed to identify records uniquely, not to descriptive or categorical fields where duplicates are natural. + + + +## What happens when constraints are violated + +Baserow prevents operations that would violate constraints and provides clear error messages explaining the issue. + +### Manual entry in Grid View + +When typing a duplicate value: +1. User enters a value that already exists +2. Upon leaving the cell (blur event), Baserow validates +3. Error message displays: `Field data constraint violation. Unable to complete operation due to existing constraints violation.` +4. Value is not saved until the user enters a unique value + +### Form submissions + +When forms include constrained fields: +1. User submits form with duplicate value +2. Form submission fails before creating the row +3. Error message displays: `Field data constraint violation. Unable to complete operation due to existing constraints violation.` +4. User must correct the value and resubmit + +### API operations + +API requests violating constraints return error responses: + +**HTTP status:** 400 Bad Request +**Row creation:** Fails, no row is created +**Response:** Includes field-specific error details + +### CSV imports + +When importing data with duplicates: +1. Baserow validates each row during import +2. Rows violating constraints are rejected +3. Import report shows which rows failed: `The following row indexes couldn't be imported` +4. Valid rows import successfully +5. You must clean duplicate data and re-import failed rows + +> Check for duplicates in your CSV before importing to constrained fields using spreadsheet tools like Excel's ""Remove Duplicates"" or conditional formatting. + +## Constraints and existing data + +### Adding constraints to populated fields + +When adding a constraint to a field containing data, Baserow validates existing values: + +**If no violations exist:** +- Constraint applies immediately +- Future entries are validated against existing values +- No data changes required + +**If violations exist:** +- Constraint application fails with an error +- Error message lists duplicate values found +- You must resolve duplicates manually before enabling the constraint +- Options: Delete duplicate rows, change values to be unique, or consolidate data + +### Checking for duplicates before constraining + +Before applying a unique constraint, verify no duplicates exist: + +1. Create a [filter][6] showing duplicate values +2. Use a formula field to identify duplicates across rows +3. Manually search for common values +4. Export data and use spreadsheet tools to find duplicates + +> **Formula technique:** Create a Count field linking back to the same table filtered by the field value; counts over 1 indicate duplicates. + +## Frequently asked questions + +### Can I add unique constraints to fields that already have duplicate data? + +No, you must resolve all duplicates before applying a unique constraint. Baserow validates existing data when you attempt to enable the constraint and provides error messages showing which values are duplicated. Clean up the duplicates first, then apply the constraint. + +### What happens if I try to paste duplicate values into a constrained field? + +The paste operation fails for cells that would create duplicates. Baserow validates each paste operation and rejects values violating constraints. You'll see error indicators on the rejected cells and must enter unique values instead. + +### Do constraints work with forms and API simultaneously? + +Yes, constraints are enforced across all data entry methods: manual Grid View entry, form submissions, API operations, CSV imports, and automation workflows. This ensures data quality regardless of how users or systems interact with your database. + +### Can I temporarily disable a constraint without deleting it? + +No, constraints are either enabled or disabled; there's no temporary suspension. To allow duplicates temporarily, you must remove the constraint entirely through field settings, then re-enable it later. Note that duplicates created during this period must be cleaned before re-enabling. + +### How do unique constraints handle case sensitivity? + +Unique constraints are case-sensitive for text fields. ""example@email.com"" and ""Example@Email.com"" are not considered duplicates. + +### What's the difference between unique constraints and filters? + +Constraints **prevent** invalid data from being saved (enforcement). Filters **hide** data from view but don't prevent creation (display). Use constraints for data integrity rules that must never be violated, and filters for temporary views of data subsets. + +## Related content + +- [Field configuration options][field-config] - Access constraint settings through field editor +- [Data validation][validation] - Additional data quality strategies +- [CSV import guide][import] - Handle constrained fields during import +- [API documentation][100] - Work with constraints in API operations +- [Form configuration][forms] - Understand constraint behavior in forms +- [Field types overview][field-types] - Learn which fields support constraints + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account + +[6]: /user-docs/filters-in-baserow +[100]: /user-docs/database-api +[field-config]: /user-docs/field-customization +[field-types]: /user-docs/baserow-field-overview +[forms]: /user-docs/guide-to-creating-forms-in-baserow +[import]: /user-docs/create-a-table-via-import +[validation]: /user-docs/data-validation-strategies",,baserow_user_docs,https://baserow.io/user-docs/field-value-constraints +394,Custom CSS and JavaScript,custom-css-and-javascript,Custom CSS and JavaScript in Baserow Application Builder,"# Custom CSS and JavaScript in Application Builder + +![enter image description here][1] + +Take your applications to the next level by adding custom **CSS** and **JavaScript** in the Baserow Application Builder. This feature gives you the freedom to go beyond Baserow’s built-in tools—tailor the look and feel of your app, add advanced interactivity, or connect to external services. + +## What you can do + +With custom code, you can: +- Style your application with custom CSS +- Add interactive behavior using JavaScript +- Embed external scripts and stylesheets (e.g. Google Analytics, payment widgets, chat plugins, etc.) + +## How to use it + +1. Open your application project in the Application Builder. +2. Go to **Application settings**. +3. Click on the **Custom CSS/JS** tab. +4. Add your code to the appropriate section: + - **CSS** for custom styling + - **JavaScript** for functionality and interactivity + - **External resources** to load third-party libraries or tools + +> ⚠️ Custom code is only applied in the **preview** or **published** version of your application. It won’t be executed inside the editor. + +## Use cases + +- Add custom branding with fonts, colors, and layout tweaks +- Integrate external services like analytics, support widgets, or payment tools +- Build dynamic UI elements with JavaScript (e.g. sliders, tabs, modal windows) + + + [1]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/ed41667c-7c9e-4cdb-94a5-31b83227f472/Custom%20code.png",,baserow_user_docs,https://baserow.io/user-docs/custom-css-and-javascript +425,Self-hosted license types,self-hosted-licenses,Self-hosted license types in Baserow,"# Baserow self-hosted license types + +Self-hosted licensing makes it easy to control user access and costs while maintaining deployment flexibility across your infrastructure. + +Baserow self-hosted offers three license types: Premium, Advanced, and Enterprise. Each has different seat management and scaling approaches. + +## Overview + +Self-hosted Baserow licenses determine how paid features are distributed to users in your instance. You can change between plans as your needs evolve. + +Self-hosted licenses also support [instance ID changes][3], allowing you to transfer licenses between different servers, migrate to new infrastructure without losing licensing, and maintain licensing continuity during deployment changes. + +[Visit this page][5] to learn more about purchasing a self-hosted license. + +## License type comparison + +The admin [subscribes per seat][1] and manually assigns users to seats. Mixing free and billable users within the same instance makes it possible to have multiple licenses in one instance and pay only for users who need upgraded features. The key difference lies in seat assignment. + +Understanding these differences helps you choose the right approach for your organization's size, budget, and administrative preferences. + +### Premium self-hosted licenses + +Premium self-hosted licenses provide precise control over which users access paid features through manual seat assignment. Add additional Premium licenses as your organization grows. + +> Premium plan doesn’t support free roles or role-based permissions. You set the initial seat count when you [purchase a subscription][2], which defines your licensed user capacity. + +### Advanced self-hosted licenses + +Advanced self-hosted licenses grant paid access to users on your instance, simplifying administration while providing [comprehensive features][4]. + +> When you upgrade to the Advanced plan, start by buying only the number of paid seats you need. Once your license is active, you can then invite free users to join your workspace. + +### Enterprise licenses + +Enterprise licenses provide maximum flexibility and features for large organizations with complex requirements. + +Enterprise licensing requires direct consultation with Baserow's sales team to ensure proper configuration for your organization's needs. + +[Contact Baserow sales](https://baserow.io/contact-sales) to discuss Enterprise licensing options and pricing. + +## Frequently asked questions + +### Can I mix different license types on the same instance? + +No, you cannot combine different license types. Each instance must use a single license approach: Premium, Advanced, or Enterprise. + +### How do license transfers work between instances? + +You can [change the instance ID][3] associated with your subscription, allowing license transfer between different server deployments as your infrastructure needs evolve. + +### Can I have some users on free and others on self-hosted? + +Yes, billable and free users can collaborate in the same workspaces as license is instance-based. Billable users access paid features while free users work within standard limitations. + +### Do I need to restart my instance after license installation? + +License activation typically requires an instance restart to enable paid features and apply new configurations. Learn more about [getting started with self-hosted licensing][5]. + +Ready to upgrade your self-hosted Baserow instance? Visit the [Baserow pricing page](https://baserow.io/pricing) to compare plans and features. + +## Related content + +- [Baserow pricing plans overview](/user-docs/pricing-plans) +- [Install self-hosted license](https://baserow.io/user-docs/get-a-licence-key) +- [Enterprise license activation](/user-docs/activate-enterprise-license) +- [Enterprise admin panel guide](/user-docs/enterprise-admin-panel) +- [Getting and changing instance ID](/user-docs/getting-and-changing-the-instance-id) + +--- + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we're ready to assist you. + +- [Ask the Baserow community](https://community.baserow.io) +- [Contact support](/contact) for questions about Baserow or help with your account. + + + [1]: https://baserow.io/user-docs/subscriptions-overview + [2]: https://baserow.io/user-docs/buying-a-subscription + [3]: https://baserow.io/user-docs/getting-and-changing-the-instance-id + [4]: https://baserow.io/user-docs/pricing-plans + [5]: https://baserow.io/user-docs/get-a-licence-key",,baserow_user_docs,https://baserow.io/user-docs/self-hosted-licenses +426,Cancel subscription,cancel-subscriptions,Cancel Baserow subscription,"# How to cancel your Baserow subscription + +In this section, we'll cover how to cancel your Baserow subscription. When you cancel, [paid features][1] continue working until your next scheduled payment date, but no refunds are provided for unused time. + + +## Quick overview + +Baserow follows a ""use what you paid for"" cancellation policy. When you cancel a subscription, you're not requesting an immediate service termination or refund. Instead, you're choosing not to renew at the end of your current billing period. + +If you cancel on the 5th day of a monthly subscription, you still have 25 days to change your mind before the cancellation takes effect. + +Learn how to [manage an existing subscription][3]. + +![Baserow subscription interface][2] + + + +## Step-by-step guide to canceling your subscription + +### Step 1: Access your subscriptions + +Navigate to the [Baserow subscriptions page](https://baserow.io/subscriptions) and log in with your account credentials. This is the same interface used for all subscription management, regardless of whether you use cloud or self-hosted Baserow. + +### Step 2: Locate your subscription + +Find the subscription you want to cancel from your list of active subscriptions. Each subscription shows its current status, renewal date, and associated workspace to help you identify the correct one. + +Click **More details** next to the subscription you want to cancel to open the detailed management interface. + +### Step 3: Access cancellation options + +Within the subscription details page, click **Change subscription** to access modification options. This button opens a menu that includes upgrade, downgrade, and cancellation choices. + +### Step 4: Initiate cancellation + +Select **Cancel subscription** from the modification options to begin the cancellation process. The system will display a confirmation dialog explaining when the cancellation takes effect and what happens to your data and features. + +![Cancel Baserow subscription interface][4] + + +### Step 5: Confirm your decision + +Review the cancellation details, including your service end date and any important information about feature limitations after cancellation. Confirm the cancellation to complete the process. + +Your subscription status will update to show ""Canceling"" with the effective end date displayed prominently. + +## After cancellation: transitioning to free features + +Once your subscription expires, Baserow automatically transitions your account to the free plan. Your data remains intact, but you'll encounter feature limitations based on the free plan's restrictions. + +Consider downgrading to a lower-tier paid plan instead of canceling entirely. This approach maintains some paid features at a reduced cost, potentially providing a middle ground between full upgraded access and free plan limitations. + +## Frequently asked questions + +### Will I receive a refund when I cancel my Baserow subscription? + +No, Baserow does not provide refunds for canceled subscriptions because your service continues until the end of your prepaid period. You receive the full value of your payment by maintaining access to paid features until your subscription naturally expires. + +### How long do I have to export my data after canceling? + +You can export your data anytime until your subscription period ends. For example, if you cancel a monthly subscription 10 days into the billing cycle, you have the remaining 20 days to export data using paid features. After the period ends, you'll need to work within free plan limitations for data export. + +### Can I reactivate my subscription after canceling? + +Yes, you can reactivate your subscription before it expires by returning to the [subscriptions page][5] and choosing to resume payments. If your subscription has already expired, you can start a new subscription at any time, though you may need to reconfigure paid features. + +### What happens to my workspaces when my subscription expires? + +Your workspaces remain accessible, but [paid features][1] become unavailable. This includes advanced field types, increased row limits, API access, and collaboration tools depending on your subscription level. Your data stays intact, but you'll work within free plan constraints. + +### Do I get charged again if I don't cancel before the renewal date? + +If you don't cancel before your subscription period ends, Baserow automatically renews your subscription and charges your payment method for the next period. Cancellation must be completed before the renewal date to avoid the next charge. + +## Related content + + - [Subscriptions overview][6] + - [Baserow pricing and plans][1] + - [Purchase subscription][5] + - [Install self-hosted license][7] + - [Manage subscription][3] + +--- + +If you're looking for something else or need further assistance with your Baserow account: + +- [Ask the Baserow community](https://community.baserow.io) for user experiences and alternative solutions +- [Contact support](/contact) for help with subscription issues or questions about feature transitions + + + [1]: https://baserow.io/user-docs/pricing-plans + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/b07426a7-89b0-479e-855a-072bb6079a44/Subscription%20management%20option.jpg + [3]: https://baserow.io/user-docs/change-a-paid-subscription + [4]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/d32255fb-252e-46ab-9709-2490c92bff89/License%20update%20interface.jpg + [5]: https://baserow.io/user-docs/buying-a-subscription + [6]: https://baserow.io/user-docs/subscriptions-overview + [7]: https://baserow.io/user-docs/get-a-licence-key",,baserow_user_docs,https://baserow.io/user-docs/cancel-subscriptions +427,Update payment method,update-payment-methods,Update payment method in Baserow,"# How to update payment method in Baserow + +Baserow's unified billing system lets you update payment methods for any subscription type through a single interface. Whether you're running Baserow in the cloud or self-hosting your instance, all payment management happens through the same secure portal. + +## Overview + +Baserow separates the application hosting from [subscription][1] management. Your subscription determines your feature access and support level, while your deployment method determines where your data lives. + +## How to update your payment method + +### Step 1: Access your subscriptions + +Navigate to the [Baserow subscriptions page](https://baserow.io/subscriptions) in your web browser. You'll need to log in with the same account credentials you use for your Baserow workspace, whether that workspace runs in the cloud or on your own servers. + +![Subscription management][2] + +### Step 2: Locate your subscription + +Find the specific subscription you want to update from your list of active subscriptions. Each subscription displays its current status, billing cycle, and associated workspace information to help you identify the correct one. + +Click the **More details** button next to your target subscription to open the detailed management interface. + +### Step 3: Initiate payment method change + +Within the subscription details page, look for the payment information section in the top-right corner of the interface. This section shows your current payment method details and provides access to billing management functions. + +Click the **Change payment method** button to begin the update process. This action redirects you to a secure payment processing interface where you can safely enter new payment card information. + +![View license ID][3] + +### Step 4: Complete the update + +Enter your new payment card details in the secure form. The system encrypts all payment information during transmission and storage to protect your financial data. Once you submit the new information, Baserow immediately validates the payment method and updates your subscription. + +Your service continues without interruption, and all future billing cycles will use the new payment method automatically. + +## Next steps + +After successfully updating your payment method, consider reviewing your subscription details to ensure they match your current needs. You might want to adjust your plan level, billing frequency, or workspace allocations based on how your usage has evolved. + +Keep your contact information current in your Baserow account settings so you receive important billing notifications and service updates. This includes keeping your email address updated, as Baserow sends payment confirmations and renewal notices to your registered email. + +## Frequently asked questions + +### Why do self-hosted users need to update payment methods through baserow.io? + +Self-hosted Baserow instances still require active subscriptions to access paid features and support. The centralized billing system at baserow.io manages these subscriptions regardless of where you host your Baserow application. This approach ensures consistent feature access and simplifies license management across different deployment types. + +### How long does it take for payment method changes to take effect? + +Payment method updates take effect immediately after successful validation. Your next billing cycle will automatically use the new payment method, and you'll receive email confirmation of the change within a few minutes. + +### What happens to my service during the payment method update process? + +Your Baserow service continues running normally during payment method updates. The process only affects future billing cycles and doesn't interrupt your current access or data availability. + +### Can I use the same payment method for multiple Baserow subscriptions? + +Yes, you can assign the same payment method to multiple Baserow subscriptions within your account. Each subscription bills separately according to its own cycle and pricing plan. + +### What payment methods does Baserow accept for subscriptions? + +Baserow accepts major credit cards (Visa, Mastercard, American Express) and debit cards for subscription payments. The exact payment options may vary by region and are displayed during the payment method update process. + +## Troubleshooting payment method updates + +If you encounter issues updating your payment method, first verify that your new card information is entered correctly, including the card number, expiration date, and security code. Ensure your card has sufficient available credit or funds to cover your subscription costs. + +Contact your card issuer if the payment method validation fails repeatedly, as they may be blocking the transaction for security reasons. International cards sometimes require authorization for recurring subscription payments. + +For persistent issues or questions about your specific subscription, reach out to Baserow support through the contact options provided at the end of this documentation. + +## Related content + + - [Subscriptions overview][4] + - [Baserow pricing and plans][5] + - [Purchase subscription][6] + - [Install self-hosted license][7] + - [Manage subscription][8] + - [Manage instance ID][9] + +--- + +## Need additional help? + +If you're looking for something else or need further assistance with your Baserow account: + + - [Ask the Baserow community](https://community.baserow.io) for user-to-user support and tips + - [Contact support](/contact) for direct help with account issues or billing questions + + + [1]: https://baserow.io/subscriptions + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/b07426a7-89b0-479e-855a-072bb6079a44/Subscription%20management%20option.jpg + [3]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/bff6f7c3-6ccc-453b-942d-4ae2f012abec/view%20your%20license%20ID.jpg + [4]: https://baserow.io/user-docs/subscriptions-overview + [5]: https://baserow.io/user-docs/pricing-plans + [6]: https://baserow.io/user-docs/buying-a-subscription + [7]: https://baserow.io/user-docs/get-a-licence-key + [8]: https://baserow.io/user-docs/change-a-paid-subscription + [9]: https://baserow.io/user-docs/getting-and-changing-the-instance-id",,baserow_user_docs,https://baserow.io/user-docs/update-payment-methods +458,Generative AI,configure-generative-ai,Configure AI models in Baserow,"# Configure generative AI in Baserow + +Baserow integrates with multiple AI providers (OpenAI, Anthropic, Ollama, OpenRouter, Mistral) to power the [AI field][1] and generative features. + +## What you need to know + +Baserow's generative AI configuration lets you connect your preferred AI models directly to your workspace. + +Baserow Self-Hosted users can configure at workspace-level for team-specific models, or instance-level for organization-wide settings. + +![Baserow AI field configuration interface][2] + +## Configure API keys + +### At instance level + +For self-hosted Baserow, configure API keys globally using [environment variables][3]. This applies settings across all workspaces in your instance. + +### At workspace level + +1. Navigate to the [workspace dashboard][4] to access the settings +2. Select **Generative AI** +3. Enter your API key and model preferences +4. Settings apply to all workspace members + +> Workspace-level configuration overrides instance defaults. Leave fields blank to use instance-level settings. + +![AI field tutorial][5] + +## Supported AI providers + +| Provider | Required Configuration | Example Models | +|----------|----------------------|----------------| +| **OpenAI** | API key + Organization (optional) + Enabled Models | gpt-3.5-turbo, gpt-4 | +| **Anthropic** | API key + Enabled Models | claude-3-haiku-20240307, claude-opus-4-20250514 | +| **Ollama** | Host + Enabled Models | llama2, mistral | +| **Mistral** | API key + Enabled Models | mistral-large-latest, mistral-small-latest | +| **OpenRouter** | API key + Organization (optional) + Enabled Models | openai/gpt-4o,anthropic/claude-3-haiku | + +### OpenAI setup + +Provide: +- [OpenAI API key][6] for authentication. Without an API key, users cannot select OpenAI models. +- OpenAI organization name (optional) +- Comma-separated list of [OpenAI models][7] to enable (e.g., `gpt-3.5-turbo, gpt-4-turbo-preview`). Note that this only works if an OpenAI API key is set. If this variable is not provided, the user won’t be able to choose a model. + +### Anthropic setup + +Provide: + - [Anthropic API key][8] for authentication + - Comma-separated list of [Anthropic models][9] to enable (e.g., `claude-3-haiku-20240307, claude-opus-4-20250514`) + +### OpenRouter setup + +Provide: + + - [OpenRouter API key][10] for authentication. + - Optionally provide an Open Router organization name that will be used when making an API connection. + - Provide a comma-separated list of [Open Router models][11] that you would like to enable in the instance (e.g. `openai/gpt-4o`, `anthropic/claude-3-haiku`). Note that this only works if an API key is set. If this variable is not provided, the user won’t be able to choose a model. + +### Ollama setup + +Provide: +- [Ollama][12] host URL. Provide the hostname to your Ollama server. This typically runs locally on your own device. +- Comma-separated list of [Ollama models][13] to enable (e.g., `llama2`) + +Ollama enables local model hosting for enhanced data privacy. + +### Mistral setup + +Provide: +- [Mistral API key][14] for authentication +- Comma-separated list of [Mistral models][15] to enable (e.g., `mistral-large-latest,mistral-small-latest`) + +## Frequently asked questions + +### What AI models are available on Baserow Cloud? + +Baserow integrates with multiple AI providers (OpenAI, Anthropic, Ollama, OpenRouter, Mistral) to power the [AI field][1] and generative features. + +### Can I use multiple AI providers simultaneously? + +Yes. Configure multiple providers at workspace or instance level. Users can select their preferred model when creating AI fields. + +### Where do I find my API keys? + + - **OpenAI:** [OpenAI API dashboard][6] + - **Anthropic:** [Anthropic console][8] + - **Mistral:** [Mistral platform][14] + - **Ollama:** Self-hosted, no API key required + - **OpenRouter:** [OpenRouter API keys][10] + +### What happens if I don't configure an API key for self-hosted Baserow? + +AI fields will be disabled until you add at least one provider's API key at workspace or instance level. + +### Do workspace-level settings override instance settings? + +Yes. Workspace-level API keys and model selections take precedence over instance defaults. Leave workspace fields blank to inherit instance configuration. + +## Related documentation + +- [AI prompt field type][16] - Learn how to use AI fields in your tables +- [Generate formulas with Baserow AI][17] - Automate formula creation +- [Workspace settings][4] - Configure workspace preferences +- [Environment variables for self-hosted installation][3] - Instance-level configuration + +--- + +**Need help?** Visit the [Baserow community][18] or [contact support][19] for assistance with your account. + + + [1]: https://baserow.io/user-docs/ai-field + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/11dc38d8-051a-481a-86b1-38f3c0c7484f/ai_field_improvements.webp + [3]: /docs/installation%2Fconfiguration#generative-ai-configuration + [4]: /user-docs/setting-up-a-workspace + [5]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/d9a7a43a-4f4b-4d5d-8231-78f9064f63ea/AI%20Field.png + [6]: https://help.openai.com/en/articles/4936850-where-do-i-find-my-openai-api-key + [7]: https://platform.openai.com/docs/models/overview + [8]: https://docs.anthropic.com/en/api/getting-started + [9]: https://docs.anthropic.com/en/docs/about-claude/models + [10]: https://openrouter.ai/settings/keys + [11]: https://openrouter.ai/models + [12]: https://ollama.com/ + [13]: https://ollama.com/library + [14]: https://docs.mistral.ai/getting-started/quickstart/ + [15]: https://docs.mistral.ai/getting-started/models/models_overview/ + [16]: /user-docs/ai-field + [17]: /user-docs/generate-formulas-with-baserow-ai + [18]: https://community.baserow.io/ + [19]: /contact",,baserow_user_docs,https://baserow.io/user-docs/configure-generative-ai +491,Write effective prompts,ai-prompt-guide,Writing effective AI prompts in Baserow,"# Write effective AI prompts in Baserow + +Great AI results start with clear prompts. Whether generating formulas, creating content in AI fields, or analyzing documents, specific instructions produce better outputs. This guide teaches you to write prompts that get accurate, useful results from Baserow's AI features. + +This guide covers prompt writing for: +- **[AI prompt field](/user-docs/ai-field)** - Generating text, classifications, and document analysis +- **[AI formula generator](/user-docs/generate-formulas-with-baserow-ai)** - Creating formulas from descriptions +- **General AI interactions** - Chatbots and assistants + +## Overview + +Clear, specific prompts get better AI results. Include what you want, reference your data with `{Field Name}`, and specify output format. Test on a few rows before generating for your whole table. + +AI models respond to the instructions you provide—your ""prompt."" The quality of AI-generated content depends heavily on how well you communicate your intent. A vague prompt produces vague results; a detailed, structured prompt produces precisely what you need. + +## The prompt formula + +Every good prompt needs four parts: + +1. **Task** - What you want done +2. **Input** - Data to process using `{Field Name}` +3. **Format** - How to structure output +4. **Constraints** - Rules and boundaries + +**Example:** + +``` +Classify this review as Positive, Neutral, or Negative. +Review: {Customer Review} +Return only one word. +``` + +## Prompt patterns + +### Classification + +``` +Classify {Input Field} as [Option1], [Option2], or [Option3]. +Return only one of these options. +``` + +This pattern works well for support ticket routing, sentiment analysis, and lead scoring. + +### Summarization + +``` +Summarize {Input Field} in [X] sentences focusing on [key aspects]. +``` + +This pattern is effective for condensing meeting notes, customer feedback, or long documents while maintaining key information. + +### Extraction + +``` +Extract from {Input Field}: Item 1, Item 2, Item 3. +If any field is missing, return ""Not found"" +``` + +This pattern helps pull specific data from invoices, resumes, and forms. + +### Generation + +``` +Write a [content type] for [audience]. +Input: {Field Name} +Tone: [style] +Length: [constraint] +``` + +This pattern is ideal for creating product descriptions, email responses, and social media posts. + +## Best practices + +### For AI fields + +✅ **Do:** +- Reference fields with exact names: `{Customer Name}`, `{Order Total}` +- Set appropriate temperature (0.1 for consistent, 0.8 for creative) +- Use ""Choices"" output type for classifications +- Test on 5-10 rows before bulk generation + +❌ **Don't:** +- Use generic terms like ""the name column"" +- Skip edge case handling for empty or unusual values +- Generate for 1000 rows without testing first + +### For formula generation + +✅ **Do:** +- Describe what you want: ""Calculate 20% discount if quantity over 100"" +- Use exact field names: ""Multiply {Hours Worked} by {Hourly Rate}"" +- Specify output format: ""Round to 2 decimals"" +- Handle edge cases: ""If quantity is 0 or blank, show 0"" + +❌ **Don't:** +- Describe syntax: ""Use an IF function to check..."" +- Use generic terms: ""the hours column"" +- Combine multiple calculations into one prompt + +### For document analysis + +✅ **Do:** +- List what to extract: ""Invoice number, date, total, vendor name"" +- Specify format: ""Return as bullet list"" +- Handle missing data: ""If field not found, write 'N/A'"" + +❌ **Don't:** +- Use vague requests: ""Get the important information"" +- Assume AI knows document type +- Skip format specification + +## Temperature settings + +| Setting | When to use | Examples | +|---------|-------------|----------| +| **0 - 0.3** | You need consistent, factual outputs | Classification, data extraction, summaries | +| **0.4 - 0.6** | You need balanced outputs | General business writing, Q&A | +| **0.7 - 1.0** | You need creative, varied outputs | Marketing copy, product descriptions | + +## Common mistakes + +### Too vague +❌ ""Analyze this data"" +✅ ""Identify the top 3 sales trends from {Sales Data} in Q4 2024"" + +### Missing context +❌ ""Classify this: {Text}"" +✅ ""Classify this support ticket as Bug, Feature, or Question: {Ticket Description}"" + +### No error handling +❌ ""Extract invoice total from {PDF}"" +✅ ""Extract invoice total from {Invoice PDF}. If missing, return 'Unable to process'"" + +### Overly complex +❌ ""Analyze sentiment, extract topics, classify category, and generate response"" +✅ Create separate AI fields for each task + +### Generic field references +❌ ""Calculate 10% of the total column"" +✅ ""Calculate 10% of {Order Total}"" + +## Formula generation examples + +### Calculate project deadline status +**What you want:** Flag projects that are overdue or due within 7 days + +**Prompt:** +``` +If {Due Date} is in the past, show 'Overdue'. +If it's within 7 days, show 'Due Soon'. +Otherwise, show 'On Track'. +``` + +### Calculate discounted price +**What you want:** Apply different discount percentages based on order quantity + +**Prompt:** +``` +If {Quantity} is over 100, reduce {Price} by 20%. +If {Quantity} is over 50, reduce by 10%. +Otherwise, use full {Price}. +``` + +### Format full name +**What you want:** Combine first and last name with proper spacing + +**Prompt:** +``` +Combine {First Name} and {Last Name} with a space between them. +``` + +### Calculate days until event +**What you want:** Show number of days remaining until an event date + +**Prompt:** +``` +Calculate the number of days between today and {Event Date}. +``` + +### Budget variance percentage +**What you want:** Show how far actual spending is from budget as a percentage + +**Prompt:** +``` +Calculate the percentage difference between {Budget} and {Actual Spend}. +Round to 2 decimals. +``` + +## Troubleshooting + +**Why are my outputs inconsistent?** +Lower the temperature to 0.1–0.3 and add explicit constraints to improve consistency. + +**Why does the AI ignore parts of my prompt?** +Simplify the prompt and place the most important instructions first. + +**Why is the AI making up information?** +Add: ""Only use information from `Field Name`. If not available, return 'Not found'."" + +**Why is the output in the wrong format?** +Provide a clear example: ""Format as: Label: Value"" + +**Why does it work for some rows but fail for others?** +Handle empty fields explicitly: ""If `Field` is blank, return 'N/A'."" + +## Related documentation + + - [AI field](/user-docs/ai-field) - Generate text and analyze documents + - [Generate formulas with AI](/user-docs/generate-formulas-with-baserow-ai) - Create formulas from descriptions + - [File field](/user-docs/file-field) - Upload documents for AI analysis + - [Formula field reference](/user-docs/understanding-formulas) - Complete formula syntax + - [10 tips for writing effective AI prompts][1] + - [How to transform data into actionable insights with Baserow AI][2] + +--- + +**Need help?** Visit the [Baserow community](https://community.baserow.io) or [contact support](/contact). + + + [1]: https://baserow.io/blog/write-effective-ai-prompts + [2]: https://baserow.io/blog/transform-data-into-insights-with-baserow-ai",,baserow_user_docs,https://baserow.io/user-docs/ai-prompt-guide +590,Date dependency,date-dependency,Baserow's Date Dependency,"# Date dependency + +Baserow's Date Dependency makes project planning simple by automatically shifting related tasks when your schedule changes. + +This guide covers how to use Baserow's Date Dependencies feature to link rows and automatically manage project schedules. You'll learn how to set up dependencies and how they keep your timelines consistent. + +> This feature is available on a paid plan. To enable it, [upgrade your account by subscribing][1]. + +## Overview + +Date Dependencies let you link rows in a table so that their dates update automatically based on relationships you set. When you adjust a ""parent"" row's date, all dependent ""child"" rows shift proportionally, preserving the original time intervals. + +This feature is ideal for project schedules, Gantt charts, or any workflow where a delay in one task needs to automatically push back the start dates of all subsequent activities. You can create a dependency by linking two date fields (like a `Start Date` and `End Date`) and defining how they relate to each other. + +![Date dependency in Baserow][2] + +## How to set up date dependencies + +You can configure dependencies from your table or view settings. This setup applies to the entire table. + + 1. Navigate to the [view][3] or [table menu][4] you want to manage. + 2. Click the three-dot icon (`⋮`) next to any table or view to open the menu. + 3. Select **""Configure date dependencies""** from the dropdown menu. + 4. A configuration modal will open. From here: + * **[""Select 'Duration' field...""]** This field must use the “d h” [duration format][5]. + * **[""Select the 'Start [Date' field][6]...""]** + * **[""Select the 'End [Date' field][6]...""]** + * **[""Define the relationship...""]** Use a [Link-to-table field][7] to connect a row to its predecessors. +5. Click **Save** + + +Once configured, any change you make to a date in one linked row will automatically adjust the dates in its dependent rows to maintain the correct schedule. + + +## Frequently Asked Questions (FAQs) + +### Does this only work with Timeline Views? + +No, Date Dependencies are set at the table level and will apply to all views. However, they are most visually apparent and useful when used with the **[Timeline View](/user-docs/guide-to-timeline-view)**, as you can see the schedule shifts in real-time. + +### Can I link dates across different tables? + +Date Dependencies currently only apply to rows within the same table. + +### Can I use fields like ""Created on"" or ""Last modified""? + +Dependencies generally require editable date fields (like `Date` or `Last Modified`). You cannot typically use a computed field like `Created on` as the one that gets *changed* by a dependency. + +## Related content + + * [Timeline View](/user-docs/guide-to-timeline-view) + * [Date and time fields](/user-docs/date-and-time-fields) + * [Views overview](/user-docs/overview-of-baserow-views) + * [Configure table options](/user-docs/customize-a-table) + +--- + + +Still need help? If you're looking for something else, please feel free to make recommendations or ask us questions; we’re ready to assist you. + + - [Ask the Baserow community](https://community.baserow.io) + - [Contact support](/contact) for questions about Baserow or help with your account. + + + [1]: https://baserow.io/pricing + [2]: https://baserow-backend-production20240528124524339000000001.s3.amazonaws.com/pagedown-uploads/be957e7c-0a80-4956-993c-80c2836cd6f9/date_dependency.png + [3]: https://baserow.io/user-docs/view-customization + [4]: https://baserow.io/user-docs/customize-a-table + [5]: https://baserow.io/user-docs/duration-field + [6]: https://baserow.io/user-docs/date-and-time-fields + [7]: https://baserow.io/user-docs/link-to-table-field",,baserow_user_docs,https://baserow.io/user-docs/date-dependency +1,What is Baserow?,faq,What is Baserow?,"What is Baserow? + +Baserow is an open-source no-code database. Our database platform enables both non-technical and technical teams to capture, organize and build logical relationships between data to trigger decisions and automate processes. We focus on openness, scalability, performance, and data security.",faq,faq,https://baserow.io/faq +2,Who Baserow is suitable for?,faq,Who Baserow is suitable for?,"Who Baserow is suitable for? + +Baserow works with companies of all sizes, across every industry — even ones with strict data governance rules as we offer self-hosting solutions. Whatever work you do, you can capture, organize, visualize and maintain all your data efficiently using Baserow.",faq,faq,https://baserow.io/faq +3,Why should my company use Baserow?,faq,Why should my company use Baserow?,"Why should my company use Baserow? + +Baserow is a to-go solution to keep everything in sync across any organization. Use Baserow to: + +- Align everyone on tasks and objectives. +- Collaborate more effectively between team members. +- Visualize progress on your projects. +- Keep your data updated and visible to everyone. + +If you use Excel to capture and organize data, using Baserow gives you more: collaboration, more data types, different views, relationships between tables and much more. Baserow is a real database without technical developer skills required.",faq,faq,https://baserow.io/faq +4,Which open-source license does Baserow have?,faq,Which open-source license does Baserow have?,"Which open-source license does Baserow have? + +Almost all of the Baserow code is MIT licensed, and it is the most permissive license out there. As a permissive license, it puts only very limited restrictions on reuse and has, therefore, high license compatibility.",faq,faq,https://baserow.io/faq +5,What languages does Baserow support?,faq,What languages does Baserow support?,"What languages does Baserow support? + +Baserow is available in 6 languages: English, Français, Nederlands, Deutsch, Italiano, Español — and it’s only the beginning! We’ll continue making our product feel native to more and more people. To set up your language: go to Settings → Interface Language in your account.",faq,faq,https://baserow.io/faq +6,How to move data from baserow.io –> self-hosted?,faq,How to move data from baserow.io –> self-hosted?,"How to move data from baserow.io –> self-hosted? + +With the workspace export/import feature, you can now migrate your data from hosted to self-hosted version independently. Simply export your workspace from the hosted version and import it into your self-hosted instance.",faq,faq,https://baserow.io/faq +7,How can I contact the support team?,faq,How can I contact the support team?,"How can I contact the support team? + +If you want to share a feature idea, submit feedback, or report an issue and get some help from fellow makers, please go to the community forum: https://community.baserow.io/.",faq,faq,https://baserow.io/faq +8,Is it possible to collaborate in Baserow?,faq,Is it possible to collaborate in Baserow?,"Is it possible to collaborate in Baserow? + +Yes! Invite whoever needs to be involved via email and collaborate in real-time. Changes in data are immediately visible.",faq,faq,https://baserow.io/faq +9,How do I add a license to Baserow Self-Hosted?,faq,How do I add a license to Baserow Self-Hosted?,"How do I add a license to Baserow Self-Hosted? + +You first need to create an account in the hosted version, Baserow Cloud. Here, you will see a subscriptions link in the left sidebar. In it, you can buy a license to Baserow-Self-Hosted. + +After you've purchased your license you need to copy the license key, go to your self-hosted environment, click on Admin -> Licenses -> Register license, and paste the license there.",faq,faq,https://baserow.io/faq +10,Can I embed Baserow?,faq,Can I embed Baserow?,"Can I embed Baserow? + +Yes, you can embed a publicly shared grid view via an iframe.",faq,faq,https://baserow.io/faq +11,Can I use Baserow as the backend for the web applications?,faq,Can I use Baserow as the backend for the web applications?,"Can I use Baserow as the backend for the web applications? + +Of course! You can store, retrieve, update, and delete your data in Baserow. Set up webhooks to track all changes made to your data by receiving real-time notifications.",faq,faq,https://baserow.io/faq +12,How do I purchase a subscription?,faq,How do I purchase a subscription?,"How do I purchase a subscription? + +Sign in to your Baserow account. Under Subscriptions, choose Add new. Select SaaS (hosted cloud version) or Self hosted (your own server), and follow the steps listed on the Payment page.",faq,faq,https://baserow.io/faq +13,What payment methods are accepted?,faq,What payment methods are accepted?,"What payment methods are accepted? + +Currently, you can pay only with a credit card. We plan to add more payment methods in the future.",faq,faq,https://baserow.io/faq +14,How do I change the subscription plan (downgrade/upgrade)?,faq,How do I change the subscription plan (downgrade/upgrade)?,"How do I change the subscription plan (downgrade/upgrade)? + +Sign in to your Baserow account. Under Subscriptions, choose Workspace and click on More details. Select Change Subscription, choose the desired plan, then select Confirm Change",faq,faq,https://baserow.io/faq +15,Can I cancel my subscription?,faq,Can I cancel my subscription?,"Can I cancel my subscription? + +Sign in to your Baserow account. Under Subscriptions, choose Workspace and click on More details. Select Cancel Subscription and confirm the action in the pop-up by clicking Cancel Subscription again.",faq,faq,https://baserow.io/faq +16,Will Baserow be free forever?,faq,Will Baserow be free forever?,"Will Baserow be free forever? + +Baserow hosted version will remain free, but if you want to store more data you need to upgrade to the next plan. Upgrading will also give you access to the Premium features. The self-hosted version will never have row, storage, or API request limitations. It will always be unlimited and free. However, if you want to activate the Premium features, you need to pay for it on a per-user per-month basis.",faq,faq,https://baserow.io/faq +17,Does Baserow offer discounts?,faq,Does Baserow offer discounts?,"Does Baserow offer discounts? + +Yes, we provide offer discounts for non-profits and education. Contact our sales team for more information.",faq,faq,https://baserow.io/faq +18,Where is the Baserow server located?,faq,Where is the Baserow server located?,"Where is the Baserow server located? + +Baserow servers are located in Germany.",faq,faq,https://baserow.io/faq +19,"What are the limitations in records, rows, and API requests?",faq,"What are the limitations in records, rows, and API requests?","What are the limitations in records, rows, and API requests? + +Baserow Self-Hosted will never place limits on rows, records, webhooks, or API requests—they will always be unlimited. Each Baserow Cloud plan has specific row limits. If a workspace exceeds its row limit for 7 days, you won't be able to create new rows. You'll receive an error message explaining that you must either upgrade your plan or reduce your row count to continue adding data. In Baserow Cloud, there's a limit of 10 concurrent API requests. This limit is subject to a fair use policy, and we reserve the right to lower it if it affects overall performance. For webhooks in Baserow Cloud, there is a maximum capacity of 5,000 pending calls per webhook. Any additional calls beyond this limit will be dropped. Please note that webhook calls are handled one at a time.",faq,faq,https://baserow.io/faq +20,Does Baserow have a rate limit?,faq,Does Baserow have a rate limit?,"Does Baserow have a rate limit? + +The self-hosted version of Baserow does not have a rate limit. The hosted version has a rate limit of maximum 10 concurrent requests. Requests are typically faster on tables with a lower number of fields and rows.",faq,faq,https://baserow.io/faq +21,"Why do I receive a ""Connection to the server failed"" pop-up on Baserow.io?",faq,"Why do I receive a ""Connection to the server failed"" pop-up on Baserow.io?","Why do I receive a ""Connection to the server failed"" pop-up on Baserow.io? + +Baserow has an active web socket connection to receive real-time updates. The ""Connection to the server failed"" pop-up on Baserow.io is related to real-time collaboration. It indicates that there is a temporary issue with your connection to the Baserow server. This could be due to a variety of reasons, such as network instability, server maintenance, or an interruption in your internet connection. If you lose your internet connection, put your device in sleep mode, or similar, you could lose connection. Baserow will attempt to reconnect many times, but it will display a warning if that fails. In many cases, the connection problem is usually temporary. You can restore the connection to the Baserow server by refreshing the page. If the issue persists or you suspect it’s specific to your Baserow account, contact the Baserow support team for further assistance.",faq,faq,https://baserow.io/faq +22,What are the security and privacy measures and practices implemented by Baserow?,faq,What are the security and privacy measures and practices implemented by Baserow?,"What are the security and privacy measures and practices implemented by Baserow? + +We prioritize data protection through several measures. Firstly, user data is regularly backed up with point-in-time recovery, ensuring data integrity and availability. Additionally, all data stores and S3 buckets housing customer data are encrypted at rest, enhancing data security. For data transmission, TLS 1.2 or higher is utilized, bolstering security when data is transmitted over potentially insecure networks. + +In terms of compliance, we are SOC 2 Type II, GDPR, and HIPAA compliant, reflecting our commitment to meeting industry standards. Transparency is a priority, with almost all of our code being source available, allowing for scrutiny and verification. + +Access control is enforced through role-based security measures, providing robust authentication and ensuring only authorized personnel have access to sensitive data. Our team members play an essential role in maintaining security, as they undergo regular internal training to stay vigilant and respond effectively to potential threats. + +Data location is a critical aspect of our security strategy, and all user data is securely stored in Amsterdam, Netherlands, Europe, ensuring data safety and compliance with regional regulations. + +To proactively address security risks, we employ automated vulnerability scanning and utilize frameworks like Django and Vue.js in our development processes to avoid common security mistakes, safeguarding our systems and user data.",faq,faq,https://baserow.io/faq +56,What compliance and security certifications does Baserow hold?,faq,What compliance and security certifications does Baserow hold?,"What compliance and security certifications does Baserow hold? + +Safeguarding data is fundamental to Baserow. Baserow is GDPR, HIPAA, and SOC 2 compliant. We prioritize privacy and security across every part of our platform and infrastructure. Building and maintaining user trust is paramount, and we consistently seek opportunities to enhance Baserow's privacy and security.",faq,faq,https://baserow.io/faq From c8932d6ca9a7bb8f9187c40161a590debdad68dc Mon Sep 17 00:00:00 2001 From: Bram Date: Fri, 14 Nov 2025 13:06:51 +0100 Subject: [PATCH 10/13] Add suggestions to the welcome message (#4252) --- .../assets/scss/components/assistant.scss | 64 +++++++++++- .../assistant/AssistantInputMessage.vue | 9 ++ .../components/assistant/AssistantPanel.vue | 3 + .../assistant/AssistantWelcomeMessage.vue | 97 ++++++++++++++++++- .../baserow_enterprise/locales/en.json | 17 +++- 5 files changed, 186 insertions(+), 4 deletions(-) diff --git a/enterprise/web-frontend/modules/baserow_enterprise/assets/scss/components/assistant.scss b/enterprise/web-frontend/modules/baserow_enterprise/assets/scss/components/assistant.scss index 5f0c9fc65b..317430ca3a 100644 --- a/enterprise/web-frontend/modules/baserow_enterprise/assets/scss/components/assistant.scss +++ b/enterprise/web-frontend/modules/baserow_enterprise/assets/scss/components/assistant.scss @@ -42,6 +42,7 @@ padding: 20px 11px 0 20px; overflow-y: auto; display: flex; + flex-direction: column; scrollbar-gutter: stable; } @@ -71,7 +72,7 @@ @extend %ellipsis; font-size: 13px; - font-weight: ⁨; + font-weight: 500; line-height: 20px; flex: 1; @@ -82,7 +83,8 @@ } .assistant__welcome { - flex: 1; + flex: 0 0 auto; + min-height: 100%; display: flex; flex-direction: column; align-items: center; @@ -139,6 +141,64 @@ color: $palette-neutral-700; } +.assistant__suggestions { + padding-bottom: 12px; +} + +.assistant__suggestion { + display: flex; + gap: 18px; + border: solid 1px $palette-neutral-200; + padding: 14px 18px; + text-align: left; + width: 100%; + margin-bottom: 12px; + + @include rounded($rounded-xl); + @include elevation($elevation-low); + + &:hover { + text-decoration: none; + border-color: $palette-neutral-400; + } +} + +.assistant__suggestion-icon-wrapper { + flex: 0 0 40px; +} + +.assistant__suggestion-icon { + width: 40px; + height: 40px; + line-height: 40px; + border-radius: 100%; + background-color: $palette-neutral-50; + color: $palette-neutral-700; + text-align: center; +} + +.assistant__suggestion-text { + min-width: 0; +} + +.assistant__suggestion-title { + @extend %ellipsis; + + font-size: 13px; + font-weight: 500; + line-height: 20px; + margin-bottom: 4px; + color: $palette-neutral-1200; +} + +.assistant__suggestion-description { + @extend %ellipsis; + + font-size: 12px; + line-height: 20px; + color: $palette-neutral-900; +} + .assistant__input { padding: 20px; padding-top: 8px; diff --git a/enterprise/web-frontend/modules/baserow_enterprise/components/assistant/AssistantInputMessage.vue b/enterprise/web-frontend/modules/baserow_enterprise/components/assistant/AssistantInputMessage.vue index 045cc24e3c..1e6792f991 100644 --- a/enterprise/web-frontend/modules/baserow_enterprise/components/assistant/AssistantInputMessage.vue +++ b/enterprise/web-frontend/modules/baserow_enterprise/components/assistant/AssistantInputMessage.vue @@ -85,6 +85,15 @@ export default { this.adjustHeight() }, methods: { + setCurrentMessage(message) { + this.currentMessage = message + + this.$nextTick(() => { + this.calculateLineHeight() + this.adjustHeight() + this.$refs.textarea.focus() + }) + }, handleEnter(event) { // If shift key is pressed, allow the default behavior (new line) if (!event.shiftKey) { diff --git a/enterprise/web-frontend/modules/baserow_enterprise/components/assistant/AssistantPanel.vue b/enterprise/web-frontend/modules/baserow_enterprise/components/assistant/AssistantPanel.vue index 43f7b1bf5b..4af20542fa 100644 --- a/enterprise/web-frontend/modules/baserow_enterprise/components/assistant/AssistantPanel.vue +++ b/enterprise/web-frontend/modules/baserow_enterprise/components/assistant/AssistantPanel.vue @@ -46,10 +46,13 @@ @@ -42,6 +64,10 @@ export default { type: String, default: 'there', }, + uiContext: { + type: Object, + default: () => ({}), + }, }, computed: { video() { @@ -50,6 +76,75 @@ export default { image() { return image }, + suggestions() { + let type = this.uiContext.applicationType || null + if (this.uiContext.table) { + type = 'table' + } + const mapping = { + null: [ + { + id: 'database', + icon: 'iconoir-view-grid', + title: this.$t('assistantWelcomeMessage.promptCreateDatabaseTitle'), + prompt: this.$t( + 'assistantWelcomeMessage.promptCreateDatabasePrompt' + ), + }, + { + id: 'automation', + icon: 'baserow-icon-automation', + title: this.$t( + 'assistantWelcomeMessage.promptCreateAutomationTitle' + ), + prompt: this.$t( + 'assistantWelcomeMessage.promptCreateAutomationPrompt' + ), + }, + { + id: 'how', + icon: 'iconoir-send-mail', + title: this.$t('assistantWelcomeMessage.promptInviteUsersTitle'), + prompt: this.$t('assistantWelcomeMessage.promptInviteUsersPrompt'), + }, + ], + database: [ + { + id: 'table', + icon: 'iconoir-view-grid', + title: this.$t('assistantWelcomeMessage.promptCreateTableTitle'), + prompt: this.$t('assistantWelcomeMessage.promptCreateTablePrompt'), + }, + { + id: 'which-tables', + icon: 'iconoir-view-grid', + title: this.$t('assistantWelcomeMessage.promptWhichTablesTitle'), + prompt: this.$t('assistantWelcomeMessage.promptWhichTablesPrompt'), + }, + ], + table: [ + { + id: 'form', + icon: 'iconoir-submit-document', + title: this.$t('assistantWelcomeMessage.promptCreateFormTitle'), + prompt: this.$t('assistantWelcomeMessage.promptCreateFormPrompt'), + }, + { + id: 'filter', + icon: 'iconoir-filter', + title: this.$t('assistantWelcomeMessage.promptCreateFilterTitle'), + prompt: this.$t('assistantWelcomeMessage.promptCreateFilterPrompt'), + }, + { + id: 'table', + icon: 'iconoir-view-grid', + title: this.$t('assistantWelcomeMessage.promptCreateTableTitle'), + prompt: this.$t('assistantWelcomeMessage.promptCreateTablePrompt'), + }, + ], + } + return mapping[type] || [] + }, }, } diff --git a/enterprise/web-frontend/modules/baserow_enterprise/locales/en.json b/enterprise/web-frontend/modules/baserow_enterprise/locales/en.json index 40c1fb5902..94ff54fa87 100644 --- a/enterprise/web-frontend/modules/baserow_enterprise/locales/en.json +++ b/enterprise/web-frontend/modules/baserow_enterprise/locales/en.json @@ -331,7 +331,22 @@ "assistantWelcomeMessage": { "greet": "Hey {name}", "question": "my name is Kuma!", - "subtitle": "I’ll help you bear the load so it never feels heavy. Choose from the prompts below or just tell me what you need!" + "subtitle": "I’ll help you bear the load so it never feels heavy. Choose from the prompts below or just tell me what you need!", + "subtitleWithoutSuggestions": "I’ll help you bear the load so it never feels heavy. Just tell me what you need!", + "promptCreateDatabaseTitle": "Create a database", + "promptCreateDatabasePrompt": "Build a project management database.", + "promptCreateAutomationTitle": "Create an automation", + "promptCreateAutomationPrompt": "Create an automation that every Tuesday in the morning asks in the Slack developers channel if there is anything to demo.", + "promptInviteUsersTitle": "Invite users", + "promptInviteUsersPrompt": "How do I invite users to my workspace?", + "promptCreateTableTitle": "Create a table", + "promptCreateTablePrompt": "Create a new table named tasks.", + "promptWhichTablesTitle": "Which tables", + "promptWhichTablesPrompt": "Which tables do I have in this database?", + "promptCreateFormTitle": "Create a form", + "promptCreateFormPrompt": "Create a form for this table.", + "promptCreateFilterTitle": "Create a filter", + "promptCreateFilterPrompt": "Show only rows where the primary field is empty." }, "assistantInputMessage": { "statusWaiting": "Assistant is ready to help", From f7704e825881dbba18650d78a5ba9e693a686ca6 Mon Sep 17 00:00:00 2001 From: Peter Evans Date: Fri, 14 Nov 2025 13:31:06 +0000 Subject: [PATCH 11/13] Introduce "Send Slack message" in application builder. (#4239) * Adding the builder workflow action for the new Slack send message service. * Lint fix; tweaks * Add the issue_origin --- backend/src/baserow/contrib/builder/apps.py | 4 ++ .../0067_slackwritemessageworkflowaction.py | 42 +++++++++++++++++++ .../builder/workflow_actions/models.py | 4 ++ .../workflow_actions/workflow_action_types.py | 14 +++++++ .../integrations/slack/service_types.py | 7 ++++ .../baserow/test_utils/fixtures/service.py | 4 ++ ...ew_slack_send_message_workflow_action.json | 9 ++++ .../builder/components/event/Event.vue | 1 + .../components/event/WorkflowAction.vue | 8 +++- web-frontend/modules/builder/plugin.js | 5 +++ .../modules/builder/workflowActionTypes.js | 20 +++++++-- .../assets/scss/components/builder/all.scss | 1 + .../components/builder/workflow_action.scss | 3 ++ .../assets/scss/components/button_text.scss | 4 ++ .../modules/core/components/ButtonText.vue | 9 ++++ .../integrations/slack/serviceTypes.js | 15 +++++-- 16 files changed, 143 insertions(+), 7 deletions(-) create mode 100644 backend/src/baserow/contrib/builder/migrations/0067_slackwritemessageworkflowaction.py create mode 100644 changelog/entries/unreleased/feature/4237_introduced_the_new_slack_send_message_workflow_action.json create mode 100644 web-frontend/modules/core/assets/scss/components/builder/workflow_action.scss diff --git a/backend/src/baserow/contrib/builder/apps.py b/backend/src/baserow/contrib/builder/apps.py index 8cd53c07f6..9cfb1dcb8a 100644 --- a/backend/src/baserow/contrib/builder/apps.py +++ b/backend/src/baserow/contrib/builder/apps.py @@ -286,6 +286,7 @@ def ready(self): NotificationWorkflowActionType, OpenPageWorkflowActionType, RefreshDataSourceWorkflowActionType, + SlackWriteMessageWorkflowActionType, UpdateRowWorkflowActionType, ) @@ -301,6 +302,9 @@ def ready(self): builder_workflow_action_type_registry.register(CoreHttpRequestActionType()) builder_workflow_action_type_registry.register(CoreSMTPEmailActionType()) builder_workflow_action_type_registry.register(AIAgentWorkflowActionType()) + builder_workflow_action_type_registry.register( + SlackWriteMessageWorkflowActionType() + ) from .elements.collection_field_types import ( BooleanCollectionFieldType, diff --git a/backend/src/baserow/contrib/builder/migrations/0067_slackwritemessageworkflowaction.py b/backend/src/baserow/contrib/builder/migrations/0067_slackwritemessageworkflowaction.py new file mode 100644 index 0000000000..39e4f355e3 --- /dev/null +++ b/backend/src/baserow/contrib/builder/migrations/0067_slackwritemessageworkflowaction.py @@ -0,0 +1,42 @@ +# Generated by Django 5.0.14 on 2025-11-13 11:57 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("builder", "0066_element_visibility_condition"), + ("core", "0107_twofactorauthprovidermodel_totpauthprovidermodel_and_more"), + ] + + operations = [ + migrations.CreateModel( + name="SlackWriteMessageWorkflowAction", + fields=[ + ( + "builderworkflowaction_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="builder.builderworkflowaction", + ), + ), + ( + "service", + models.ForeignKey( + help_text="The service which this action is associated with.", + on_delete=django.db.models.deletion.CASCADE, + to="core.service", + ), + ), + ], + options={ + "abstract": False, + }, + bases=("builder.builderworkflowaction",), + ), + ] diff --git a/backend/src/baserow/contrib/builder/workflow_actions/models.py b/backend/src/baserow/contrib/builder/workflow_actions/models.py index ab29f7f195..617db002db 100644 --- a/backend/src/baserow/contrib/builder/workflow_actions/models.py +++ b/backend/src/baserow/contrib/builder/workflow_actions/models.py @@ -125,3 +125,7 @@ class CoreSMTPEmailWorkflowAction(BuilderWorkflowServiceAction): class AIAgentWorkflowAction(BuilderWorkflowServiceAction): ... + + +class SlackWriteMessageWorkflowAction(BuilderWorkflowServiceAction): + ... diff --git a/backend/src/baserow/contrib/builder/workflow_actions/workflow_action_types.py b/backend/src/baserow/contrib/builder/workflow_actions/workflow_action_types.py index c12046c7e0..4d2427a534 100644 --- a/backend/src/baserow/contrib/builder/workflow_actions/workflow_action_types.py +++ b/backend/src/baserow/contrib/builder/workflow_actions/workflow_action_types.py @@ -26,6 +26,7 @@ NotificationWorkflowAction, OpenPageWorkflowAction, RefreshDataSourceWorkflowAction, + SlackWriteMessageWorkflowAction, ) from baserow.contrib.builder.workflow_actions.registries import ( BuilderWorkflowActionType, @@ -40,6 +41,9 @@ LocalBaserowDeleteRowServiceType, LocalBaserowUpsertRowServiceType, ) +from baserow.contrib.integrations.slack.service_types import ( + SlackWriteMessageServiceType, +) from baserow.core.db import specific_queryset from baserow.core.formula.field import BASEROW_FORMULA_VERSION_INITIAL from baserow.core.formula.serializers import FormulaSerializerField @@ -493,3 +497,13 @@ class AIAgentWorkflowActionType(BuilderWorkflowServiceActionType): def get_pytest_params(self, pytest_data_fixture) -> Dict[str, int]: service = pytest_data_fixture.create_ai_agent_service() return {"service": service} + + +class SlackWriteMessageWorkflowActionType(BuilderWorkflowServiceActionType): + type = "slack_write_message" + model_class = SlackWriteMessageWorkflowAction + service_type = SlackWriteMessageServiceType.type + + def get_pytest_params(self, pytest_data_fixture) -> Dict[str, int]: + service = pytest_data_fixture.create_slack_write_message_service() + return {"service": service} diff --git a/backend/src/baserow/contrib/integrations/slack/service_types.py b/backend/src/baserow/contrib/integrations/slack/service_types.py index a2a363661a..f51fe02483 100644 --- a/backend/src/baserow/contrib/integrations/slack/service_types.py +++ b/backend/src/baserow/contrib/integrations/slack/service_types.py @@ -28,6 +28,7 @@ class SlackWriteMessageServiceType(ServiceType): allowed_fields = ["integration_id", "channel", "text"] serializer_field_names = ["integration_id", "channel", "text"] + public_serializer_field_names = ["integration_id", "channel", "text"] simple_formula_fields = ["text"] class SerializedDict(ServiceDict): @@ -55,6 +56,12 @@ def serializer_field_overrides(self): ), } + @property + def public_serializer_field_overrides(self): + # When we're exposing this service type via a "public" serializer, + # use the same overrides as usual. + return self.serializer_field_overrides + def formulas_to_resolve( self, service: SlackWriteMessageService ) -> list[FormulaToResolve]: diff --git a/backend/src/baserow/test_utils/fixtures/service.py b/backend/src/baserow/test_utils/fixtures/service.py index 3b54b600bd..d9e936056a 100644 --- a/backend/src/baserow/test_utils/fixtures/service.py +++ b/backend/src/baserow/test_utils/fixtures/service.py @@ -20,6 +20,7 @@ LocalBaserowTableServiceSort, LocalBaserowUpsertRow, ) +from baserow.contrib.integrations.slack.models import SlackWriteMessageService from baserow.core.services.registries import service_type_registry @@ -104,6 +105,9 @@ def create_core_smtp_email_service(self, **kwargs) -> CoreSMTPEmailService: def create_ai_agent_service(self, **kwargs): return self.create_service(AIAgentService, **kwargs) + def create_slack_write_message_service(self, **kwargs): + return self.create_service(SlackWriteMessageService, **kwargs) + def create_core_iterator_service(self, **kwargs): return self.create_service(CoreIteratorService, **kwargs) diff --git a/changelog/entries/unreleased/feature/4237_introduced_the_new_slack_send_message_workflow_action.json b/changelog/entries/unreleased/feature/4237_introduced_the_new_slack_send_message_workflow_action.json new file mode 100644 index 0000000000..652c28135f --- /dev/null +++ b/changelog/entries/unreleased/feature/4237_introduced_the_new_slack_send_message_workflow_action.json @@ -0,0 +1,9 @@ +{ + "type": "feature", + "message": "Introduced the new 'Slack send message' workflow action.", + "domain": "builder", + "issue_number": 4237, + "issue_origin": "github", + "bullet_points": [], + "created_at": "2025-11-13" +} diff --git a/web-frontend/modules/builder/components/event/Event.vue b/web-frontend/modules/builder/components/event/Event.vue index 2492dc5f08..7d6ee0d540 100644 --- a/web-frontend/modules/builder/components/event/Event.vue +++ b/web-frontend/modules/builder/components/event/Event.vue @@ -34,6 +34,7 @@ :key="workflowActionType.getType()" :value="workflowActionType.getType()" :icon="workflowActionType.icon" + :image="workflowActionType.image" type="primary" size="small" @click="addWorkflowAction(workflowActionType.getType())" diff --git a/web-frontend/modules/builder/components/event/WorkflowAction.vue b/web-frontend/modules/builder/components/event/WorkflowAction.vue index c1903cd0a4..a6463e302f 100644 --- a/web-frontend/modules/builder/components/event/WorkflowAction.vue +++ b/web-frontend/modules/builder/components/event/WorkflowAction.vue @@ -1,7 +1,13 @@