Records, relationships, custom columns, widgets, and webhooks, in one page.
Customermates tracks five record types, lets each one carry user-defined fields, links them to each other through typed relationships, and emits webhooks whenever any of that changes.
| Record type | What it represents | Typical fields |
|---|---|---|
| Contact | A person | firstName, lastName, notes |
| Organization | A company | name, notes |
| Deal | A sales opportunity | name, totalValue, totalQuantity |
| Service | A product or offering attached to a deal | name, amount |
| Task | A todo item | name, assignees |
Each record has id, createdAt, updatedAt, and supports markdown notes. Everything else is either a relationship to another record or a custom column value. There are no fixed status or stage fields on any record type; use custom columns for those. Call get_record_schema to read the columns that exist in a given workspace.
Relationships are typed and many-to-many. A contact belongs to zero or more organizations and zero or more deals. A deal belongs to zero or more contacts, organizations, and services (with quantities), plus assignees.
| From to | Example |
|---|---|
| Contact to Organization | "Max works at Initech" |
| Contact to Deal | "Max is a stakeholder on the Q2 contract" |
| Organization to Deal | "The Q2 contract is with Initech" |
| Deal to Service (with quantity) | "5 hours consulting plus 1 setup fee" |
| Deal / Service / Task to User | "Assigned to Julia" |
| Task to Contact / Organization / Deal / Service | "Follow up on the Q2 contract" |
Tasks link to users, contacts, organizations, deals, and services.
The default schema covers the basics. For anything else, add a custom column.
Ten types:
| Type | Use for |
|---|---|
| Plain | Free-text values |
| Date | Calendar dates (renewal, next touch) |
| DateRange | A start and end date |
| DateTime | Timestamps |
| DateTimeRange | A start and end timestamp |
| Currency | Money amounts, stored with an ISO currency code |
| Single-select | A value from a fixed option list |
| Link | One or more URLs |
| One or more email addresses | |
| Phone | One or more phone numbers |
Single-select columns are how you model your own workflows. A deal "Status" or a task "Priority" is a single-select column you define, with the options you choose, per workspace. A board view can then group records by any single-select column.
Custom columns are first-class in filters, widgets, and the MCP surface.
Widgets are dashboard charts driven by live data. You pick a record type, a group-by axis (plain field or custom column), an aggregation (count, deal value, deal quantity), and a display type (bar, doughnut, or radar). Filters narrow the data set.
A widget re-renders whenever underlying records change.
Every write emits a domain event: contact.created, deal.updated, task.deleted, and so on. You subscribe by URL and event list. Each delivery includes the changed record plus a changes map showing what moved from what to what, so subscribers can act on diffs without polling.
See Webhooks for the full event catalog and payload shape.
Notes are per-record markdown. They render through a Tiptap editor in the UI and are plain markdown everywhere else. You can replace them or append to them via update_record_notes with the matching mode.
Users are your teammates. Roles are defined per workspace and control what each user can read and write. The company is the tenant. Every record lives inside one company, and cross-tenant access is not possible.