← All examples
10

Canonical Grid model

Pipeline CRM

Track accounts as rows, then show them as a table and workflow board.

Scale
Large
Source
10-surface-pipeline-crm.grid
Length
72 lines
Collection
Apps & surfaces
Level
Beginner
Runtime
Workbook surface
Version
1.0.0

Watch it in Grid

See this model in motion.

Watch the model respond in the product, then inspect the exact source and checkpoints on this page.

Companion film

The model is the app

Declare data, logic, and interface together, then open the same model as a working pipeline board.

16 secGrid 0.61.0
Open film page

What this model gives you

One account collection shown as both an Airtable-like table and a workflow board.

20 min to study · Source reviewed 2026-08-24

Continue with guided practice

What to notice

  • Row bindings
  • Table configuration
  • Kanban mapping
  • Shared model state

Requirements

  • Table surface
  • Kanban surface
  • No connector

Expected checkpoint

A known state for this walkthrough.

After loading the canonical source with its authored account rows.

Accounts
3 rows
Pipeline
186,000
Board
3 stages
01 · Model

Accounts remain ordinary records

The total is a formula over Accounts, not a total calculated by either surface.

02 · Table

Fields become an operational record view

The Table binds directly to Accounts and names the fields people need to browse.

03 · Board

The same rows become a workflow

Kanban maps stage, name, and owner while leaving the underlying model unchanged.

10-surface-pipeline-crm.grid
Get Grid
MODEL "Pipeline CRM"
DESCRIPTION "Track accounts as rows, then show them as a table and workflow board."
VERSION "1.0.0"
AUTHOR "AI Agent"
TAGS "surface-template", "crm", "table", "kanban", "surfaces"

Accounts = [
  { name: "Acme", owner: "Mina", stage: "lead", value: 42000 },
  { name: "Northstar", owner: "Owen", stage: "qualified", value: 88000 },
  { name: "River Co", owner: "June", stage: "proposal", value: 56000 }
]

TotalPipeline IS currency = SUM(MAP(Accounts, row => row.value))

Accounts_Table!type = "table"
Accounts_Table!config = """
version = 1
kind = "table"
title = "Accounts"

[columns]
bind = "Accounts"
title = "Accounts"

[[columns.fields]]
key = "name"
label = "Account"

[[columns.fields]]
key = "owner"
label = "Owner"

[[columns.fields]]
key = "stage"
label = "Stage"

[[columns.fields]]
key = "value"
label = "Value"
"""
Accounts_Table!data = ""

Pipeline_Board!type = "kanban"
Pipeline_Board!config = """
version = 1
kind = "kanban"
title = "Pipeline"

[layout]
wip_limit = 8

[[columns]]
id = "lead"
title = "Lead"

[[columns]]
id = "qualified"
title = "Qualified"

[[columns]]
id = "proposal"
title = "Proposal"

[items]
bind = "Accounts"
column = "stage"
title = "name"
assignee = "owner"
"""
Pipeline_Board!data = ""

END MODEL