Tables and Data
Tables are the foundation of GOD CRM. Every piece of information -- contacts, deals, tasks, document
Tables are the foundation of GOD CRM. Every piece of information -- contacts, deals, tasks, documents, wellness records, lab nodes -- is stored in a table. This chapter explains how tables work, what types of columns you can use, and how views let you see the same data in different ways.
The Notebook Analogy
Think of a notebook you use at school.
- A Raw Table is like a notebook stored in a drawer. The notebook exists and has information written in it, but you are not looking at it right now. It just sits in storage.
- A Universal Table is that same notebook taken out of the drawer and opened on your desk. Now you can read the pages, write new entries, cross things out, and flip between sections.
In GOD CRM, the raw table is the data sitting in the database. The universal table is the spreadsheet-like interface you see on screen. They are the same data -- one is the storage form, and the other is the visible form.
What Is a Raw Table?
Behind the scenes, GOD CRM stores table data in two database tables:
- universal_tables -- holds the definition of each table: its name, which project it belongs to, and what columns it has.
- table_rows -- holds the actual rows of data. Each row is linked to its parent table.
You never interact with raw tables directly. They are the engine under the hood. When you open a table in the browser, GOD CRM reads from these database tables and shows you a friendly spreadsheet.
Why does this matter?
Because everything in GOD CRM is stored this way. When you create a Document, the system stores it as a row in a table. When you log a Wellness entry, that is a row in a table. When you build a Workflow, the nodes are rows in a table. This is the "everything is a table" principle, and it means you can filter, sort, and connect any kind of data using the same tools.
What Is a Universal Table?
A Universal Table is what you see and use. It looks like a spreadsheet:
+----+----------------+------------------+--------+------------+
| # | Name | Email | Status | Created |
+----+----------------+------------------+--------+------------+
| 1 | Alice Johnson | alice@example.com| Active | 2026-01-15 |
| 2 | Bob Smith | bob@example.com | Active | 2026-01-16 |
| 3 | Carol Davis | carol@example.com| Paused | 2026-01-17 |
| 4 | Dan Wilson | dan@example.com | Active | 2026-01-18 |
| 5 | Eve Martinez | eve@example.com | New | 2026-01-20 |
+----+----------------+------------------+--------+------------+
Each row is one record (a contact, a deal, a task -- whatever the table tracks). Each column defines a type of information. You can add rows, edit cells, delete records, and rearrange columns just like in a regular spreadsheet.
Columns: The 23 Types
Every column in a table has a type that controls what kind of data it holds and
how it behaves. GOD CRM supports 23 column types (defined in
COLUMN_TYPE_METADATA in the source code). Here they are, grouped by category.
Basic types -- the everyday building blocks.
| Type | Emoji | What it stores | Example |
|---|---|---|---|
| Text | 📝 | Plain text | "Alice Johnson" |
| Number | 🔢 | Numeric values (also currency/percent via format option) | 42, $1,250, 75% |
| ✉️ | Email address with validation | alice@example.com | |
| URL | 🔗 | Web link | https://example.com |
| Phone | 📞 | Phone number with formatting | +1 (555) 123-4567 |
| Date | 📅 | Date only (YYYY-MM-DD) | 2026-01-20 |
| Date & Time | 📅 | Date with time | 2026-01-20 14:30 |
| Time (cron) | ⏰ | Schedule (HH:MM, day of month) | 09:00, day 15 |
| Checkbox | ☑️ | True/false toggle | checked / unchecked |
Selection types -- picking from a list.
| Type | Emoji | What it stores | Example |
|---|---|---|---|
| Select | 🎯 | One option from a list | "Active" |
| Multi-select | 🧩 | Multiple options from a list | "Design", "Frontend" |
Advanced types -- linking, computing, and special fields.
| Type | Emoji | What it stores | Example |
|---|---|---|---|
| Relation | 🔗 | Link to a row in another table | Link to "Acme Corp" |
| Person | 👤 | Reference to a system user | Alice (user #5) |
| File | 📎 | File attachment | report.pdf |
| Image | 🖼️ | Image attachment with preview | photo.jpg |
| Password | 🔐 | Encrypted text (hashed, write-only) | ●●●●●●●● |
| Formula | ∑ | Calculated from other columns | =Price * Quantity |
| Table | 📋 | Embedded sub-table | Order items |
| Rollup | 📊 | Aggregation across related rows | SUM of linked values |
| Button | 🔘 | Action trigger | "Send Email" button |
Media and AI types -- for creative and AI-powered workflows.
| Type | Emoji | What it stores | Example |
|---|---|---|---|
| Audio | 🎵 | Audio file with playback | recording.mp3 |
| Color | 🎨 | Color value (HEX/CMYK/RAL) or emoji | #3B82F6 (blue) |
| Vector | 🧠 | AI embedding for semantic search | [0.12, -0.34, ...] |
| Dialog | 💬 | AI dialog context | Conversation history |
| Chat | 🤖 | AI chat thread | Chat with agent |
Important: Currency and percent are NOT separate column types. They are
format options on the Number type (config.format = "currency" or "percent").
How to choose: Pick the type that matches the data. Storing a name? Use Text. Storing a price? Use Number with currency format. Linking tables? Use Relation.
The Grid View: Your Data Browser
The table grid (Layer 2) is the default way you interact with your data. It looks and works like a spreadsheet: rows and columns, inline editing, sorting, and filtering. The grid view is the only view that belongs to the Universal Table layer.
Grid View (spreadsheet):
+------+-----------+--------+---------+
| Name | Company | Status | Value |
+------+-----------+--------+---------+
| ... | ... | ... | ... |
+------+-----------+--------+---------+
The grid is best for browsing, editing, and bulk data entry. You can apply filters, sort by any column, hide or show columns, and edit cells inline.
Beyond the Grid: Modules (Layer 3)
If you want to see your data in a different way -- as a Kanban board, a calendar, a timeline, or a gallery -- those are Modules (Layer 3). Modules are full-page applications that provide a specialized interface on top of the same underlying table data.
Here are the data-focused Modules that give you alternative ways to interact with your table data:
Kanban Module
Cards arranged in columns, where each column represents a status or category. Best for tracking items through stages, like a sales pipeline or a task board.
Kanban Module:
New In Progress Done
+--------+ +--------+ +--------+
| Card 1 | | Card 3 | | Card 5 |
+--------+ +--------+ +--------+
| Card 2 | | Card 4 |
+--------+ +--------+
Calendar Module
Records displayed on a calendar based on a date column. Best for scheduling, deadlines, and events.
Calendar Module:
Mon Tue Wed Thu Fri
+------+------+------+------+------+
| |Task A| |Task B| |
| | | | |Event |
+------+------+------+------+------+
Timeline Module
A horizontal bar chart showing records stretched across a time range. Similar to a Gantt chart. Best for project planning where tasks have start and end dates.
Timeline Module:
Jan 1 Jan 15 Jan 31
|----Task A------|
|--------Task B----------|
|---Task C----|
Gallery Module
Records displayed as cards with a featured image. Best for visual content like product catalogs, portfolios, or contact directories.
Gallery Module:
+----------+ +----------+ +----------+
| [image] | | [image] | | [image] |
| Product A| | Product B| | Product C|
| $29.99 | | $49.99 | | $19.99 |
+----------+ +----------+ +----------+
All of these Modules read from the same Raw Table (Layer 1) as the grid view. The data is the same -- only the interface is different. For a full description of all Modules, see 06 -- Modules.
Filters and Sorting
Views become powerful when you add filters and sorting.
Filters
A filter hides rows that do not match a condition. Examples:
- Show only rows where Status equals "Active"
- Show only rows where Created At is after January 1, 2026
- Show only rows where Value is greater than 1000
You can combine multiple filters. For example: Status is "Active" AND Value is greater than 1000. Only rows that match all conditions will appear.
Sorting
Sorting changes the order of rows. Examples:
- Sort by Name A to Z
- Sort by Created At newest first
- Sort by Value highest to lowest
You can sort by multiple columns. For example: first sort by Status, then within each status group sort by Name.
Filters and Sorting Do Not Change Your Data
This is important to understand. When you filter or sort, you are changing what you see, not what is stored. Remove the filter and all your rows come back. Change the sort order and the data itself is unchanged. You are just adjusting your view.
The "Everything Is a Table" Principle
This is one of the most important ideas in GOD CRM. Nearly every kind of data in the system is stored as rows in a table:
| Feature | What is stored | How it is stored |
|---|---|---|
| Contacts | People and companies | Rows in a Contacts table |
| Deals | Sales opportunities | Rows in a Deals table |
| Tasks | To-do items | Rows in a Tasks table |
| Documents | Notes and pages | Rows in a Documents table |
| Wellness | Health and habit logs | Rows in a Wellness table |
| Lab Nodes | Workflow building blocks | Rows in a Lab table |
Because everything is a table, you can use the same tools everywhere:
- Filter your Documents the same way you filter your Contacts.
- Sort your Wellness logs the same way you sort your Deals.
- Create a Relation column to link any table to any other table.
This consistency means you only need to learn one system. Once you know how tables, columns, views, filters, and sorting work, you can handle any data in GOD CRM.
A Complete Example: Contacts Table
Here is a Contacts table with five rows and six columns of different types:
+----+----------------+-------------------+-----------+--------+------------+
| # | Name | Email | Company | Status | Last Call |
| | (text) | (email) | (relation)| (select)| (date) |
+----+----------------+-------------------+-----------+--------+------------+
| 1 | Alice Johnson | alice@acme.com | Acme Corp | Active | 2026-01-28 |
| 2 | Bob Smith | bob@widgets.io | Widgets Co| Active | 2026-01-25 |
| 3 | Carol Davis | carol@startup.dev | StartupDev| New | |
| 4 | Dan Wilson | dan@acme.com | Acme Corp | Paused | 2026-01-10 |
| 5 | Eve Martinez | eve@freelance.net | | Active | 2026-01-30 |
+----+----------------+-------------------+-----------+--------+------------+
Notice:
- The Company column is a Relation type. It links to a separate Companies table. "Acme Corp" is not just text -- it is a link to the Acme Corp row in the Companies table.
- The Status column is a Select type with three options: Active, New, Paused.
- Carol has no Last Call date because she is new and has not been contacted yet.
- Eve has no Company because she is a freelancer.
This is the kind of table you will build and use every day in GOD CRM.
Quick Summary
| Concept | Analogy | Purpose |
|---|---|---|
| Raw Table | Notebook in a drawer | Database storage you do not touch |
| Universal Table | Notebook on your desk | The visible spreadsheet you use |
| Column | A labeled section | Defines what kind of data goes in |
| Row | One page of notes | One record (contact, deal, task) |
| Grid View | The table data browser | Spreadsheet with filters and sorting |
| Module | A specialized app | Kanban, Calendar, Timeline, Gallery |
| Filter | A bookmark | Hides rows that do not match |
| Sort | Alphabetical tabs | Changes the order of rows |
What's Next?
Your data is stored in tables. But who works with that data? In the next chapter you will meet the AI Agents -- automated helpers that can read your tables, answer questions, run workflows, and save you time.
Next: Agents -- your data is stored in tables, now meet the AI Agents that work with it.