Advanced · Lesson 16 of 22

Subpages, Detail Views & Canvas Columns

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.

⏱ ~28 min 📄 Structure & Layout ✅ Prerequisite: Lesson 15
01 — The Gap 02 — Subpages 03 — Detail Views 04 — Canvas Columns 05 — ParentRow() 06 — Real-World Patterns Practice
01 — The Gap

When a row needs more than columns.

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:

🗂️

Subpages

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.

Detail Views

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.

📝

Canvas 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.

Think of it as two axes Subpages handle document-level hierarchy (page A contains page B). Canvas columns handle row-level depth (row A has its own embedded page). Detail views are the bridge — they surface everything about a row without leaving the table context.
02 — Subpages

Nested canvases, unlimited depth.

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.

Sidebar — three subpage navigation patterns
Pattern 1 — Project Hub
📁 Projects
    📄 Alpha — project overview + tables
        📄 Kickoff Notes
        📄 Design Decisions
        📄 Retro
Pattern 2 — Team Wiki
📁 Team
    📄 Alice
        📄 Background & Skills
        📄 Goals
        📄 1-on-1 Notes
Pattern 3 — Meeting Archive
📁 Meetings
    📁 2025-04
        📄 April 15 — Sprint planning
        📄 April 22 — Design review
        📄 April 29 — Retrospective
Subpages are not just folders Each parent page has its own canvas content — tables, summaries, embeds. The "Projects" parent page might have a master rollup table showing all projects; "Alpha" has its specific tables; the subpages below that have prose and discussion. Depth is content, not just navigation.
03 — Detail Views

All a row's data, at a glance.

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.

Opening a detail view

  • Click the ⤢ expand icon that appears on hover at the left edge of any row
  • Press Space with a row selected
  • Click a row's name cell if the table has a clickable name column enabled

Customizing the detail view

  • Add tabs to group columns ("Overview", "Notes", "History")
  • Set field order — drag fields to arrange them logically
  • Set field labels — rename a column for display without renaming it globally
  • Configure in: Table settings → Customize detail view layout
Detail view tabs are a power feature A Contact row might have 20 columns. Group them: "Overview" tab shows Name, Company, Status; "Activity" tab shows Last Contact, Notes, Next Step; "History" tab shows a canvas column with the full relationship log. Editors see the right fields for each task without scrolling through everything.
04 — Canvas Columns

Each cell is its own page.

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.

Adding a canvas 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.

📄

What goes in canvas cells

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.

👁️

Editable preview

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.

Canvas columns vs Text columns A Text column stores a plain string — searchable, sortable, usable in formulas. A Canvas column stores a full Coda page — richly formatted but not directly usable in Filter() conditions or Sort() keys. Use Text for structured data you'll query; use Canvas for narrative content you'll read.
05 — ParentRow()

Reference the row from inside its canvas.

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.

ParentRow() — practical patterns inside a canvas cell
// 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() makes canvas cells row-aware Without 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.
06 — Patterns

CRM, product catalog, employee profiles.

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.

CRM — Contact detail view with canvas column open
Contact Fields
Name
Priya Mehta
Company
Meridian Labs
Status
Negotiating
Deal Value
$42,000
📝 Canvas — Relationship Notes

Mar 12: Intro call — interested in enterprise plan. Concerned about API limits.

Mar 18: Demo with engineering team. Positive. Asked for pricing proposal.

Next steps checklist
☑ Send pricing proposal
☐ Schedule legal review call
☐ Get security questionnaire back
Sub-table (filtered via ParentRow()):
3 open calls · 2 emails sent · Last contact: Mar 18
CRM

Each Contact canvas: interaction history, next steps checklist, sub-table of calls filtered with ParentRow().

Product Catalog

Each Product canvas: rich description, specs table, competitor comparison grid, imagery notes.

Employee Profiles

Each Team Member canvas: background, skills, OKRs, 1-on-1 notes archive — full HR context without a separate system.

Practice

Test your knowledge.

Subpages, Detail Views & Canvas Columns

5 Questions
Question 1 of 5
What is the key difference between a Canvas column and a Detail view?
✓ Canvas columns store independent rich content (prose, checklists, sub-tables) per row. Detail views are a read/edit layout showing all existing column values — they don't add new content storage, just a better view of what's already in columns.
Question 2 of 5
Where is ParentRow() valid?
✓ ParentRow() is a row-scoped function available exclusively inside canvas column cells. It returns the row that contains the canvas. Using it outside a canvas column produces an error.
Question 3 of 5
What does "Display editable preview" do when enabled on a Canvas column?
✓ "Display editable preview" surfaces a short text preview of the canvas content inline in the table view. It keeps the table readable at a glance without requiring every user to open each canvas cell individually.
Question 4 of 5
How do you create a subpage in Coda?
✓ Hover any page name in the sidebar to reveal the "+" button for adding a child page. You can also drag an existing page onto another to make it a subpage. Both approaches create full canvas subpages — not just folder labels.
Question 5 of 5
How do you add tabs to a row's detail view (e.g., "Overview" and "Notes")?
✓ Detail view layout customization is in Table settings. Open a table's settings panel → Customize detail view layout → add tabs, name them, then drag columns into each tab. This grouping only affects the detail view — the table itself is unchanged.
← Prev Advanced Formulas: Filter(), Map(), Reduce() Lesson 15