Tables handle structured data beautifully — but rows often need rich context: notes, rationale, history, embedded sub-tables. Canvas columns give every row its own full page. Detail views and subpages organize that context hierarchically.
Tables are excellent at storing uniform structured data. Every row has the same columns, and you can sort, filter, and group across the full dataset. But rows often carry context that doesn't fit neatly into a column: a customer's full relationship history isn't a text field — it's a series of notes, meeting summaries, and follow-up threads accumulated over months.
Coda has three tools that close this gap, and they compose naturally with each other:
Nested pages in the sidebar. Organize related canvases hierarchically — a project hub, a team wiki, a meeting archive. Full canvases at every level, not just folder labels.
Open any row's data in a form-like expanded layout. All columns visible at once. Configurable tabs, field order, and labels. Great for rows with many columns.
A column type where each cell is an independent full Coda page. Prose, checklists, embedded sub-tables, formulas — each row gets its own narrative workspace.
Any page in the sidebar can contain child pages. Hover a page name → click the "+" that appears, or drag one page onto another to make it a child. Subpages are full Coda canvases — not just folder labels. Each level has its own content, tables, and views.
Every table row has a built-in detail view — a form-style layout showing all column values at once. Open it by clicking the expand icon ⤢ on the left edge of a row, or by pressing Space on a selected row. Detail views solve a common problem: tables with many columns become unreadably wide. The detail view keeps the table clean while giving full access to every field.
A canvas column gives every row in a table its own independent Coda canvas. Unlike a text column (a box for a string), a canvas cell is a full editor — you can write prose paragraphs, add checklists, embed sub-tables, insert formulas, and paste images. Each cell's content is completely independent of every other cell in the column.
Click + column header in any table → select Canvas as the column type. The column appears with a small page icon in each cell. Click the icon to open the full-page editor for that row's canvas.
Prose paragraphs, checklists, embedded sub-tables, formula results, callout blocks, images — anything you can put on a regular Coda page can go in a canvas cell.
Enable "Display editable preview" in column settings to show a text snippet inline in the table row. Readers see context without needing to open the full canvas.
Filter() conditions or Sort() keys. Use Text for structured data you'll query; use Canvas for narrative content you'll read.
ParentRow() is a special function available only inside canvas column cells. It returns a reference to the row that contains the current canvas — letting you write formulas in the canvas that are specific to that row's data. Outside a canvas column, ParentRow() is invalid and will throw an error.
// Filter a sub-table to show only tasks for THIS project row Tasks.Filter([Project] = ParentRow()) // Show a days-remaining countdown based on the row's End Date column "Days remaining: " & (ParentRow().[End Date] - Today()) // Dynamic heading using the row's Name column "## Notes for " & ParentRow().[Name]
ParentRow(), every canvas cell in a column would be an isolated island — you couldn't reference the row's own data in formulas. ParentRow() is what makes canvas columns genuinely dynamic: a Tasks sub-table filtered by ParentRow() automatically shows the right tasks for whichever project row you open.
Canvas columns shine most in use cases where each row represents a distinct entity with a unique story — a contact, a product, a team member. The same structural pattern applies in all three: the table provides queryable structure, the canvas column provides the rich narrative layer.
Mar 12: Intro call — interested in enterprise plan. Concerned about API limits.
Mar 18: Demo with engineering team. Positive. Asked for pricing proposal.
Each Contact canvas: interaction history, next steps checklist, sub-table of calls filtered with ParentRow().
Each Product canvas: rich description, specs table, competitor comparison grid, imagery notes.
Each Team Member canvas: background, skills, OKRs, 1-on-1 notes archive — full HR context without a separate system.