Search
Track ships with full-text search across every record and timeline
entry. It's powered by Postgres tsvector columns on your Supabase
— nothing leaves your database.
Opening search
Press Cmd+K (macOS) or Ctrl+K (Windows/Linux) from
anywhere in the app. The command palette opens.
Start typing. Results are grouped:
- Contacts (name, email, phone, title, custom fields)
- Companies (name, domain, industry, custom fields)
- Deals (name, value, stage, custom fields)
- Notes & emails (timeline entries, with a snippet)
- Tasks (title + description)
Click a result — or use arrow keys + Enter — to jump to it.
Syntax
Search understands:
| Syntax | Meaning |
|---|---|
acme | Match acme in any indexed field. |
"acme corp" | Exact phrase. |
stage:won | Deals currently in a stage named "won". |
owner:me | Records owned by the current user. |
tag:enterprise | Records tagged enterprise. |
company:acme | Records linked to a company matching acme. |
type:deal | Restrict to one record type. |
created:>2026-01-01 | Records created after a date. |
-closed | Exclude results matching closed. |
Combine with spaces (all conditions must match):
type:deal stage:negotiation owner:me value:>50000
Saved searches
Run a search, then click Save in the palette. Saved searches appear in the left rail under Saved Searches and stay scoped to the user.
Performance notes
The search_index table is populated by triggers on every record
type and timeline entry. Indexing is synchronous — a freshly
created contact is searchable immediately.
For workspaces with >1M records, consider adding a GIN index on
search_index.tsv (the schema ships it, but double-check after any
custom migration):
create index if not exists search_index_tsv_idx
on search_index using gin (tsv);Fuzzy matching
Misspellings fall back to trigram similarity (pg_trgm). "Akme
corp" still finds "Acme Corp". Fuzzy results rank below exact
matches.
Admin search
Workspace admins have an extra Admin search filter that crosses soft-deleted records. Useful for finding a contact a teammate deleted last week. Everyone else only sees live records.
Excluding fields
To keep a custom field out of the search index (e.g., sensitive data), set its Searchable toggle to off in Settings → Custom Fields. The next index rebuild drops it.