Interactions & Calendar
An interaction is the atomic record of contact: an email, a call, a meeting, a note, a Telegram or Slack exchange. This guide covers the Interactions tab (a.k.a. timeline) and the Calendar tab.
The shape of an interaction
Every interaction has:
date— when it happened. Auto-set on sync, manually set when you log one by hand.type—email/call/meeting/note/telegram.source— where it came from:outlook,slack,telegram,notion,manual.direction—inbound(they reached out),outbound(we did),mutual(a meeting both parties showed up to),internal(Valinor-only — rare since we filter those out).company_id— which company this is with. Critical; drives every grouping.project_id— optional link to a specific project.people— every participant (via theinteraction_peoplejoin).subject— for emails this is the email subject; for calls/meetings it's the topic.summary— short body, max-ish 255 chars for synced items, longer for manual notes.logged_by_id— for manual entries, who typed it in.source_id/source_thread_id— the upstream message ID. Used for dedup and threading.
The Interactions tab
Filters across the top:
- Company — narrow to one company.
- Type — emails only, calls only, etc.
- Member — interactions involving a specific person.
- Source — where they came from (outlook / slack / telegram / notion / manual).
The list itself is reverse-chronological. Click any interaction to expand it (summary, full participant list) or to edit (manual entries).
Logging a manual interaction
For things that don't sync — a phone call, an in-person meeting that wasn't on calendar, a side conversation at a conference:
- Interactions tab → "+ Log interaction" (or do it from a company/project page).
- Set:
- Date (today by default)
- Type (
call,meeting,note) - Company
- Direction
- Participants (add yourself + the people on the other side)
- Summary (1-3 sentences is plenty)
- Optionally link to a project.
- Save.
A logged interaction is no different from a synced one from this point forward — it shows up in dashboards, smart lists, the audit log.
Editing a synced interaction
You can edit any interaction's summary, subject, direction, project_id, company_id, and participants. You shouldn't edit date, source, or source_id — those should match upstream.
When you re-tag a synced interaction's company_id (e.g., you realize it should have routed to a different company), the link follows. Future emails from the same domain will not auto-correct — go fix the company's email_domains array if it's a routing problem.
Deleting an interaction
You can. It hard-deletes the row and its joins. There's no soft-delete for interactions because they're high-volume.
Use sparingly. A misrouted interaction is better edited than deleted. Deletion is for genuine duplicates that slipped past the dedup logic, or for "this should never have been logged" (sometimes a personal email leaks in past skip rules).
The Calendar tab
A calendar grid showing:
- Interactions with type
meeting(and sometimescall), placed on theirdate. - Key dates from companies and projects (
key_datestable).
Use cases:
- "What's on the team's plate this week?"
- "When did we last meet with Tempo?"
- "What deadlines are coming up?"
You can filter by company, type, and member same as the Interactions tab.
How interactions land here
Most of the time, you don't add interactions by hand. They land here automatically:
- Outlook — every external email becomes an interaction (auto-routed if the sender's domain matches a known company, otherwise goes through the Sync Inbox for approval).
- Calendar events — meetings become interactions with type
meeting, with attendees resolved to people rows. - Slack — messages in mapped channels and approved DMs become interactions.
- Telegram — messages in opted-in chats become interactions.
- Notion — pipeline-synced records create interactions for state changes.
- Manual — anything you type.
The full mechanics: Sync.
Common queries
"When did we last talk to Tempo?"
Filter Company = Tempo. Top row.
"Show me every email Connor sent last week"
Filter Member = Connor, Type = email. Scroll to last week. Or just go to Connor's person detail page — same data, simpler view.
"What did Lily and Bruno meet about?"
Filter Member = Lily, Type = meeting. Skim summaries. (Or filter Member = Bruno; same set, different angle.)
"I want to skim everything we did this week"
Open the Calendar tab. Set the week. Visual scan beats scrolling the list.
What gets auto-grouped vs not
- Threaded emails — kept linked via
source_thread_id. The interaction list shows the most recent message; you can expand to see the thread context. - Recurring meetings — each occurrence is its own interaction. They don't merge.
- Slack channel chatter — each top-level message is one interaction; thread replies are linked to the parent via
thread_ts. - Group emails — one interaction with multiple participants, not one per recipient.
What's not an interaction
- A status update on a project — that's a
project_status_updatesrow, distinct from interactions. - A note on a company — that lives in the company's
notesfield, not as an interaction. - A milestone —
project_milestonesis its own table.
Use interactions for "something happened between us and them on a specific date."