Relationships & Contacts
Two tabs cover people in Laurelin: Relationships (your view) and Contacts (the full list).
How people are modeled
A person has a single canonical record in Laurelin with:
name,email,phone,role,linkedin_url,telegram_handle,slack_handleperson_type—internal(Valinor team) orexternal(counterparty)contact_type— defaults toworking. Used for distinguishing primary contacts from broader rosters.primary_flag— flags the primary contact at a company.notes— free-form.
A person is affiliated with one or more companies. Affiliations have:
role_at_company(e.g., "Head of Partnerships")started_at,ended_at
People change jobs. When someone moves from Stripe to Bridge, you don't create a new person — you end-date their Stripe affiliation and add a Bridge one.
Relationships tab
The Relationships tab is your surface — relationships where you're involved. Smart-lists down the side:
- All Companies — every company you have any relationship with.
- Needs Outreach — yours,
ball_with = us, no recent activity. - Due Soon — based on
key_datesyou own. - Ball With Us — your follow-up backlog.
- Waiting on Them — your watch-list.
- Never Contacted — companies you own with zero logged interactions.
This is the right tab for "who am I supposed to follow up with this week?" — different from Pipeline, which is the team-wide deal-flow view.
Contacts tab
The Contacts tab is the full people directory. Sub-views:
- Dashboard — total counts, signature-parser coverage, recent additions.
- My Contacts — people on projects you're on.
- By Company — grouped under each company.
- By Type — internal vs external, primary vs working contacts.
Click any person to drill into their detail.
Person detail view
Open a person, you see:
- Top card — name, role, person_type, contact_type, primary_flag, contact methods. Click to edit.
- Affiliations — companies they're (or were) at, with dates.
- Interactions — every interaction this person has been part of.
- Projects — every project they're a member or contact on.
- Notes — free-form.
- Audit trail — every change to this record (from the
changelogtable).
Common workflows
"I met someone new at a conference"
You don't need to do this manually. Most of the time:
- Add their email to your next Outlook calendar invite, or send them an intro email.
- Outlook sync ingests it.
- If their company is in Laurelin and their domain matches, the person row is auto-created and affiliated.
- If not, the email lands in your Sync Inbox and one click creates the company + person + interaction.
When you really need to add them by hand:
- Contacts tab → Add Contact.
- Name, email, role, person_type =
external, affiliation = the company.
Merging duplicates
Two people with the same email arrived from different sources (e.g., Outlook + a manual Slack contact + a Notion sync). You'll spot them on the person detail page or via the by-company groupings.
- Open the duplicate (the one you want to remove).
- Click "Merge into existing person."
- Pick the target (the one to keep).
- Confirm.
What the merge does:
- Moves all interactions, project memberships, affiliations onto the target.
- Consolidates emails (extras land in the target's
additional_emails). - Backfills empty target fields from the source (so if the target was missing
phoneand the source had one, the target keeps it). - Hard-deletes the source row.
- Logs the merge to
changelogso you can audit later.
The same flow exists for companies — open the duplicate company, "Merge into existing", pick the target.
Editing affiliations when someone moves jobs
- Open the person.
- Find the old affiliation. Set
ended_atto roughly today. - Add a new affiliation: pick the new company, set
started_at. - Update their
roleif the title changed.
Don't delete the old affiliation — its presence preserves the link from old interactions to the old company. Ending it is enough.
Signature parser — the magic auto-fill
When email syncs, every external sender's signature gets parsed (deterministic regex, no AI) for phone, title, LinkedIn URL, Telegram handle. Findings auto-fill onto the matching person row, but only into empty fields.
You don't need to do anything. It happens. A few notes:
- It runs up to 3 attempts per person (capped via
LAURELIN_SIGNATURE_MAX_ATTEMPTS). After that, no further parsing for that person. - If a field comes out wrong (rare, but happens with weird sigs), edit the person record. The parser won't overwrite — it only writes to empty fields.
- People who never email you will never get parsed. That's fine.
Setting a primary contact
Open a person. Toggle primary_flag on. Use sparingly — one primary per company is the norm. Drives the "primary contact" surfaces on dashboards.
Internal vs external
The person_type is critical:
- internal — Valinor team. Doesn't get auto-routed from inbound mail; doesn't trigger Sync Inbox items.
- external — counterparty. Every interaction with an external person is logged.
If you add a team member by hand, set person_type = internal. The Team is currently: Connor, Lily, Carlyn, Bruno, Andrew, Frank, Matt.
"I want to see who I'm spending time with"
Open Contacts → My Contacts → sort by recent interactions. Or open your own person row — the Interactions section is your full log.
What lives elsewhere
- Connecting your inbox so contacts auto-fill: Sync.
- Logging an interaction manually (call, meeting note): Interactions.
- Linking a contact to a project: open the project, Members or Contacts subtab, add.