# The Data grid

`#/data` is a spreadsheet-shaped view over thirteen sheets of real records — companies, people, leads, prospects, follow-ups, deals, conversations, calls, cases, onboarding, knowledge, files and memory. Rows are virtualised so a large sheet scrolls without loading everything. Every edit made here is handed to the service that owns that record, so the grid can never accept something the rest of Connect would refuse.

- **Status:** Available
- **Audience:** both
- **In the app:** #/data
- **Last verified:** 2026-09-10
- **Canonical:** https://connectbyjbrh.com/docs/files-data/data-grid/

## The thirteen sheets

| Sheet | What a row is | Owned by |
|---|---|---|
| Companies | An organisation record | `companies.py` |
| People | A human in the workspace's relationships | `people.py`, `identity.py` |
| Leads | An interest raised from a conversation or a call | The CRM services |
| Prospects | An organisation or person found by research, not yet a relationship | `prospecting.py` and the `prospect_*` modules |
| Follow-ups | A dated commitment on a channel, with a reason | `followups.py` |
| Deals | An opportunity on the pipeline | `sales.py` |
| Conversations | A thread across a channel | `customer_conversations.py` |
| Calls | One phone call with its outcome | The phone services |
| Cases | A post-sale support issue | `crm.py` |
| Onboarding | A new customer being brought live | `crm.py` |
| Knowledge | A source or a grounded fact | `knowledge_bank.py`, `knowledge.py` |
| Files | One document with its version chain | `file_workspace.py` |
| Memory | Something Connect knows, at one of four tiers | `connect_memory.py` |

The set is fixed at thirteen because each sheet is a window onto a service that already exists. There is no sheet for a record type Connect does not have, and adding one is a change to the product rather than a setting on the screen.

## Why it is not a second CRM

A grid over a database usually ends up being a second way to write to it, with its own idea of what is valid. This one does not. Reading is served by `data_workspace`, and every change is handed to the service that owns the record — the same service the ordinary screen calls, and the same one the Assistant's tools call.

- **A field that service will not accept cannot be written from the grid either.** The refusal is the same refusal, with the same message.
- **A rule that applies elsewhere applies here.** Compliance, suppression and autonomy are not bypassed by typing into a cell.
- **A derived value is not editable.** Where a number is computed from other records, the grid shows it and will not let you overwrite it.
- **Nothing is written that the service did not write.** The grid holds no shadow copy of a record to reconcile later.

> **Note** This is the design argument set out in [a spreadsheet view that is not a second database](/research/grid-over-services/). It is why the grid is safe to hand to somebody who has never used Connect: the worst they can do here is exactly what they could do anywhere else.

## What the grid gives you

**Virtualised rows** — Only what is on screen is rendered, so a long sheet scrolls at the same speed as a short one.
**Columns you arrange** — Resize, reorder, show and hide — [columns, order and visibility](/docs/files-data/data-columns/).
**Filtering and search** — Narrow a sheet to the rows in question — [filtering and searching a sheet](/docs/files-data/data-filtering/).
**Sort, group and freeze** — Order rows, gather them under a value, and pin the columns you read against — [sorting, grouping and freezing](/docs/files-data/data-sorting-grouping/).
**Saved views** — Keep an arrangement you use often — [saved views](/docs/files-data/saved-views/).
**Inline edit and bulk actions** — Change one cell, or many rows at once, through the owning service either way.
**Import and CSV export** — Get data in and out, with validation on the way in and formula neutralisation on the way out.
**Duplicates** — Surface rows that look like the same thing, and merge through the relationship service.

## Both audiences, one grid

The Owner and a customer see the same screen over the same code. A customer's requests are rewritten to the tenant paths by `tenantAdapt` and checked again by the `customer_safe` allowlist before they reach the same handlers, and the rows that come back are filtered by the workspace kernel and by row-level security in the database.

If a sheet looks empty on one account and full on another, the first thing to establish is which workspace you are in, not whether the grid is broken. A row belonging to somebody else is invisible by design, and that is a different condition from a row that does not exist.

## Questions

### Is the Data screen a spreadsheet I can put my own columns in?

No. Each sheet shows a record type Connect already has, with the fields that record has. You control which of those columns you see and in what order, but not what fields exist — a new field is a change to the record, not to the view over it.

### Why is the sheet count thirteen?

One sheet per record type the product holds. It is a count of what Connect manages rather than a target, which is why it changes only when the product does.

### Can I work in the grid on a phone?

There is a fallback layout for small screens that keeps reading and the narrow edits sensible and drops the things that need width. [The grid on a small screen](/docs/files-data/data-mobile/) says exactly what goes.

## Related

- [Columns, order and visibility](https://connectbyjbrh.com/docs/files-data/data-columns/)
- [Filtering and searching a sheet](https://connectbyjbrh.com/docs/files-data/data-filtering/)
- [Editing in the grid](https://connectbyjbrh.com/docs/files-data/inline-edit/)
- [Saved views](https://connectbyjbrh.com/docs/files-data/saved-views/)
- [A spreadsheet view that is not a second database](https://connectbyjbrh.com/research/grid-over-services/)
- [Importing and exporting](https://connectbyjbrh.com/docs/files-data/data-import-export/)

## What this page is based on

- docs-source/sources/GENERAL.md §9 — the Data grid and its thirteen sheets
- docs-source/sources/GENERAL.md §4 — where each service lives
- docs-source/facts.py — `MEASURED['data_sheets']`
- `backend/app/data_workspace.py`, `workspace_data_api.py`
