What Notion Actually Does
Notion is a workspace tool that combines documents, databases, wikis, and project management into a single product. Its core innovation is the block-based editor where everything is a block: paragraphs, headings, images, to-do lists, embeds, tables, and even full databases. Blocks can be nested, reordered, and converted between types. Pages can contain sub-pages, creating an infinitely nestable hierarchy that works as a wiki, documentation system, or personal knowledge base.
This is one of the most architecturally complex apps you can attempt to clone. Notion's block editor alone took their engineering team years to build. A full Notion clone on Bubble is not realistic, but a Notion-inspired workspace with page hierarchy, basic block editing, and inline databases is absolutely achievable.
Core Features Worth Cloning
For a viable Notion-style workspace, focus on page creation with a rich text editor, page hierarchy with nested sub-pages, a sidebar navigation tree showing the page structure, basic block types including text, headings, to-do lists, images and bullet lists, inline database tables with sorting and filtering, page sharing with permission levels, templates for common page structures, and workspace management for teams. Skip the full block-based editor with drag-to-reorder blocks, synced blocks across pages, the formula and relation system for databases, advanced page analytics and history, and the API and integration ecosystem. Those require engineering depth beyond what Bubble provides natively.
Data Architecture in Bubble
The data model for a Notion-style app centres on the recursive relationship between pages and blocks.
The Workspace data type holds workspace_name (text), owner (User), icon (text or image), plan (option set), and created_date (date). This is the top-level container for all content.
The Page data type needs title (text), workspace (Workspace), parent_page (Page, self-referencing for hierarchy), icon (text, emoji), cover_image (image), created_by (User), last_edited_by (User), last_edited_at (date), is_template (yes/no), position (number for ordering among siblings), and is_deleted (yes/no, soft delete). The self-referencing parent_page field creates the page tree. Top-level pages have no parent. Sub-pages reference their parent page.
The Block data type is the content building block. It stores page (Page), block_type (option set: text, heading_1, heading_2, heading_3, bullet_list, numbered_list, to_do, image, divider, quote, code, callout, database_inline), content (text), position (number with gaps for reordering), is_checked (yes/no, for to-do blocks), image (image, for image blocks), parent_block (Block, self-referencing for nesting), indent_level (number), colour (text), and created_date (date). Using an option set for block_type lets you render different UI elements based on the type while keeping all blocks in a single data type.
The Database data type represents inline databases. It needs page (Page), database_name (text), and view_type (option set: table, board, list, gallery). Inline databases are displayed within a page as a special block type.
The Database Property data type defines the columns. It stores database (Database), property_name (text), property_type (option set: text, number, select, multi_select, date, checkbox, url, person), position (number), and select_options (list of texts for select/multi-select properties).
The Database Row data type stores database (Database) and created_date (date). Individual cell values are stored in a separate type to handle the flexible schema.
The Cell Value data type links database_row (Database Row), database_property (Database Property), text_value (text), number_value (number), date_value (date), boolean_value (yes/no), and selected_options (list of texts). This entity-attribute-value pattern lets each database have different columns without creating new data types. It is not as clean as a fixed schema, but it gives you the flexibility Notion offers.
The Page Share data type handles sharing. It stores page (Page), shared_with (User), permission_level (option set: view, comment, edit), and shared_date (date).
Building the Page Editor
The page editor is where Notion's complexity lives. In Bubble, you have two main approaches.
The rich text editor approach uses a plugin like the Bubble Rich Text Editor or TinyMCE/Quill integrated via an HTML element. The user edits content in a single rich text field, and you store the output as HTML in the page's content field. This is simpler to build but gives up the block-by-block editing model. Users get a familiar word processor experience with formatting, headings, lists, and images, but cannot individually manipulate blocks. For many use cases, this is sufficient and dramatically faster to build.
The block-based approach uses a repeating group of Block records. Each block is rendered based on its block_type. Text blocks show an editable text input. Heading blocks show a larger styled input. To-do blocks show a checkbox with text. Image blocks show an image element with an upload option. The user adds new blocks using a "/" command menu (triggered by typing "/" in an empty block) or an add button between blocks. This approach requires significantly more workflow logic but gives the Notion-like editing feel.
For the block-based approach, each block in the repeating group uses conditional formatting to display the right element. If block_type is heading_1, show a large bold text input. If block_type is to_do, show a checkbox group with a text input. If block_type is image, show an image element. Use custom states on each cell to toggle between display mode and edit mode. In display mode, show the formatted content. On click, switch to edit mode and show the input field.
Sidebar Navigation Tree
The page tree in the sidebar is a recursive structure. Bubble does not natively support recursive repeating groups, so you need a workaround. The simplest approach is to limit nesting depth. Display top-level pages (where parent_page is empty) in a repeating group. For each page, show a toggle arrow. When clicked, use a custom state to show a nested repeating group of child pages (where parent_page equals the clicked page). You can go two or three levels deep with this pattern before the UI gets unwieldy. Store the user's expanded/collapsed state for each page in a list custom state on the page element to persist the sidebar state during a session.
Inline Databases
Inline databases are one of Notion's most powerful features. In Bubble, display them as repeating groups within a page when a block of type database_inline is encountered. The table view uses a repeating group of Database Rows. For each row, display Cell Values by doing a search for Cell Values where database_row equals the current row and ordering by the property's position. Each cell is rendered based on the property type: text inputs for text, number inputs for numbers, date pickers for dates, dropdowns for selects.
Adding sorting is straightforward. Let users click column headers to sort. Use custom states to track the active sort column and direction, then modify the data source's sort constraint. Filtering uses a similar pattern: add filter controls above the table that modify the data source search constraints based on property values. This is where the entity-attribute-value data model gets complex. Filtering by cell values requires nested searches (Search for Database Rows where there is a Cell Value where database_property is the filtered property and text_value contains the filter text).
Templates
Templates are pages with is_template set to yes. When a user creates a new page from a template, duplicate the template page and all its blocks. Use Bubble's "Copy a thing" feature or create a backend workflow that creates a new Page with the same fields as the template, then searches for all Blocks belonging to the template page and creates copies linked to the new page. Reset the template flag on the new page and set the creator to the current user.
Privacy Rules
Pages without explicit sharing should only be visible to the creator and workspace members. Shared pages should respect the permission level: viewers can see but not edit, commenters can view and add comments, editors can modify content. All blocks inherit their page's visibility. Database records within a page inherit the page's sharing rules. Workspace settings and member management should be restricted to workspace owners and admins.
Cost and Timeline
A Notion-style workspace with rich text editing (not full block-based) takes 8 to 12 weeks. Adding block-based editing adds 4 to 6 weeks. Inline databases add another 3 to 5 weeks. A full build with all features runs 14 to 20 weeks for an experienced developer. Use Bubble's Growth plan at $119 per month for backend workflows. Annual costs run $2,000 to $4,000 depending on plugins and usage.
Build or Hire
This is an expert-level Bubble project. The recursive data model, block editor, inline databases, and permission system each present significant challenges. If you are building a Notion-inspired tool for a specific niche (research notes, client portals, internal wikis), consider simplifying the feature set dramatically and focusing on what makes your tool different for that audience.
Related guides:
Bubble slack integration guide
Bubble openai integration guide
how to build a community platform with Bubble
Want to build a workspace or wiki tool on Bubble? Talk to Goodspeed Studio about scoping a realistic MVP.
Build a Focused Workspace, Not Another Notion
Notion succeeds because it is flexible enough for almost any use case. Your clone should succeed by being better than Notion at one specific use case. Pick a niche, build the page and database features that niche needs, and skip everything else. A client portal with structured pages and simple databases is a viable product. A full Notion replacement is a multi-year engineering project. Talk to our Bubble developers.

Harish Malhi
Founder of Goodspeed
Harish Malhi is the founder of Goodspeed, one of the top-rated Bubble agencies globally and winner of Bubble’s Agency of the Year award in 2024. He left Google to launch his first app, Diaspo, built entirely on Bubble, which gained press coverage from the BBC, ITV and more. Since then, he has helped ship over 200 products using Bubble, Framer, n8n and more - from internal tools to full-scale SaaS platforms. Harish now leads a team that helps founders and operators replace clunky workflows with fast, flexible software without writing a line of code.
Frequently Asked Questions (FAQs)
Can Bubble replicate Notion's block-based editor?
Partially. You can build a block system using a repeating group of content blocks with different types. Full drag-to-reorder and inline slash commands require custom JavaScript. Most teams start with a rich text editor and add block features incrementally.
How do I build nested pages in Bubble?
Use a self-referencing field on the Page data type called parent_page. Top-level pages have no parent. Sub-pages reference their parent. Display the hierarchy in the sidebar using nested repeating groups, limited to two or three levels deep.
Can Bubble handle Notion-style inline databases?
Yes, using an entity-attribute-value data model. Create Database, Database Property, Database Row, and Cell Value data types. This gives flexible schemas per database but adds query complexity for filtering and sorting.
How long does it take to build a Notion clone?
A simplified version with rich text pages and basic databases takes 8 to 12 weeks. A full build with block editing, inline databases, and templates takes 14 to 20 weeks with an experienced Bubble developer.
Can multiple users edit the same page simultaneously?
Basic concurrent editing works since Bubble handles database updates from multiple users. True collaborative editing with cursor presence and conflict resolution like Google Docs requires external integrations and is not practical on Bubble alone.
How do I handle page permissions and sharing?
Create a Page Share data type linking pages to users with permission levels. Set privacy rules that check the share record's permission level before allowing view, comment, or edit access. Pages without shares default to workspace member visibility.
