Laurelin user guide
A single-page reference for teammates: what Laurelin does, what's automatic, what you have to do by hand, and where the system stops. No technical detail — for the engineering view see architecture and sync internals.
If you're brand new, read this top-to-bottom once. After that, treat it as the map: each section links to the deeper guide for that area.
What Laurelin is
Laurelin is our CRM. It keeps the record of every company we talk to, every person at those companies, every project we run, and every interaction (email, call, meeting, note, Telegram, Slack) between us and them.
- Live URL: https://laurelin.valinorinfo.com/apps/laurelin.html
- Sign in: your
@valinordigital.comaccount (Cloudflare Access). - Read-only by design: Laurelin never sends mail, posts to Slack, or replies on Telegram. It logs and surfaces; the actual outbound is still you, in your usual tools.
If a single line captures the design: Laurelin remembers so you don't have to. The more you connect, the more it remembers without being told.
The model in one picture
Everything in Laurelin reduces to four kinds of record:
Company ◀── affiliation ──▶ Person
▲ ▲
│ company_id │ participants
│ (required) │ (one or more)
└─────── Interaction ─────────┘
│
│ project_id (optional)
▼
Project ──▶ linked to companies, people, key dates
- Company — an external organization (Bridge, Tempo, Stripe).
- Person — an individual, either
internal(Valinor team) orexternal(a counterparty). Affiliated with one or more companies. - Interaction — something that happened on a date. Always tied to a company; has one or more participating people; optionally linked to a project.
- Project — a unit of work (deal, fund, product, research, internal). Linked to companies, people, and key dates.
Everything else (status updates, key dates, milestones, links) hangs off these four.
Features at a glance
The sidebar tabs are the daily-work surfaces. The "More" dropdown holds the catalogues.
Sidebar (your daily tabs)
| Tab | What it's for |
|---|---|
| User Page | Your personalised landing. |
| Project Map | What projects we're working on, viewed by time and importance / impact. Visual. |
| Pipeline | Deal-flow view. |
| Relationships | Company interactions, filterable by POC, timing, and company importance. |
| Valinor Priorities | What the team is prioritising this period, ranked. Used for weekly/monthly planning. |
| Intake | Make sure interactions are logged to the correct (or new) company. |
"More" dropdown (catalogues and admin)
| Tab | What it's for |
|---|---|
| Companies | The full company list with filters and search. Add new companies. |
| Projects | The full project list. Status updates, milestones, links, members. |
| Contacts | The people directory. Add contacts, edit affiliations, merge duplicates. |
| Interactions | The interaction log (a.k.a. timeline). Filter by company, type, person, source. |
| Calendar | Interactions and key dates on a calendar grid. |
| Sync | Connect Outlook / Slack / Telegram / Notion. Triage the Sync Inbox. Manage skip rules. |
| Lost Threads | Outbound emails you sent that never got a reply. |
| Laurelin Management | Internal request queue and component health. Mostly for engineering. |
What each tab gets you
- Pipeline & Companies: stage, ball-with, importance, health, owner — five fields drive every smart list. Detail view per company has contacts, interactions, projects, key dates, links, parent/child structure, and a full audit trail. See Pipeline & Companies.
- Projects & Priorities: 12 project types (Deal, Diligence, Fund, Product, Research, Biz Dev, Internal, Legal, Infrastructure, Automation, Campaign, Finance, Other), weekly status updates, milestones, sub-projects, importance/intensity dot plot, links by type. See Projects.
- Relationships & Contacts: affiliations with start/end dates so job changes don't break history, primary-contact flag, signature parser that auto-fills role/phone/LinkedIn/handles, duplicate merge. See Contacts.
- Interactions & Calendar: five types (email, call, meeting, note, telegram), four sources (Outlook, Slack, Telegram, Notion, plus Manual), direction tagging, thread linking, calendar view of meetings and key dates. See Interactions.
- Sync: four connectors (Outlook, Slack, Telegram, Notion), a Sync Inbox that gates unknown senders, skip rules, do-not-track addresses, channel-to-company mapping for Slack. See Sync.
- Lost Threads: flags outbound mail you sent that hasn't been answered, with a "draft a follow-up" button. See Lost threads.
What's automatic
The system does this work without you asking. You see the result, not the work.
Ingest and routing
- External email from your Outlook auto-logs as an interaction. If the sender's domain is on a known company's
email_domains, it routes there directly. If not, it lands in the Sync Inbox. - Calendar events ingest as meeting interactions with attendees resolved to contacts.
- Slack messages in channels you've mapped to a company auto-log. New channels show as "Unmapped" once a message arrives.
- Telegram messages in chats you've opted in auto-log. The sender is matched by their Telegram handle or user ID.
- Notion pipeline records reconcile against Laurelin companies and projects on a schedule.
- Direction (inbound / outbound) is inferred from sender vs your address.
- Threading preserved — replies group with parents via thread IDs.
- Newsletter and bulk-mail headers dropped before they ever reach the Sync Inbox.
- Internal-only threads (every participant
@valinordigital.com) are filtered out.
Enrichment
- Signature parser reads incoming external signatures and fills in
role,phone,linkedin_url,telegram_handleon the matching person — but only into empty fields, so it never overwrites your edits. Capped at 3 attempts per person. - Domain learning — when you approve a new domain from the Sync Inbox into a company, the domain is added to that company's
email_domainsso the next message routes itself. - Person creation — when a new external sender arrives from a known-company domain, the person row is auto-created and affiliated.
Surfacing
- Smart lists (Needs Outreach, Ball With Us, Waiting on Them, Due Soon, Never Contacted) update live based on field state.
- Lost-thread detection scans outbound mail and flags threads that have gone stale, with an urgency tier (
normal/emergency) based on company stage, project key dates, and importance. - Status update nudges — Monday morning reminder if you manage projects without a status update for the past week.
- Project membership — a company is auto-added to a project's "Companies" list when you log an interaction tied to that project.
- Changelog — every edit to a company, person, or project is logged with who, when, and the old/new value. You can audit anything.
- Dedup — synced items use upstream message IDs and content hashes to prevent the same email being logged twice (or the same lost-thread candidate re-flagged on every scan).
Safety
- Read-only OAuth scopes. Outlook is
Mail.Read+Calendars.Read. Slack is the various*:historyscopes plususers:read. Telegram bot exports zero send-side methods. None of these can post on your behalf. - Email bodies stored as ~255-char previews, not full content.
- Pairing codes for Telegram are HMAC-signed and expire in 10 minutes.
- Watermarks on every sync source — a worker restart never replays history.
What you manage manually
The system can't read your mind. These are the levers you actually pull.
One-time setup
- Connect your inbox. Sync tab → Connect Outlook. One OAuth click. Without it, only what you type by hand is logged.
- Connect Slack (one OAuth click).
- Connect Telegram — three steps: generate a pairing code, message the bot, then add the bot to your Telegram Business account and opt in per chat. The highest-friction connector — see Sync → Telegram.
- Set yourself as
internalon your person row if you're not there yet. Ping Connor if needed.
Daily
- Triage the Sync Inbox. Each item: approve into an existing company, approve into a new company (one click creates company + person + interaction), merge with another inbox item, or dismiss. Anything you never want to see again becomes a skip rule.
- Skim Lost Threads. Emergencies first. Resolve / draft / dismiss. Aim for an empty-ish list — don't carry stale debt.
- Set
ball_withwhen you log a meaningful interaction.usif you owe the reply,themif you don't.
When you talk to someone
- Log calls, in-person meetings, and side-conversations by hand as interactions. Anything that didn't go through Outlook/Slack/Telegram won't auto-log.
- Add the people you spoke with to the interaction if they're new.
When a company changes
- Update
stageas a relationship progresses:dormant→prospect→exploring→active→core, or →passed. - Update
ownerif responsibility moves. - Set
target_deal_type,icp,company_types,tagsto taste — these drive your filters and slicing. - Add new
email_domainswhen a company picks up a new domain — otherwise routing breaks. - Add
key_datesfor renewals, ICs, drawdowns, deadlines — they feed the Due Soon list and the Calendar.
When a person changes
- End-date the old affiliation and add a new one when they change jobs. Don't create a duplicate person.
- Toggle
primary_flagfor the main contact at a company. Sparingly. - Merge duplicates when the same person shows up twice (different source, different email casing). One merge button moves everything onto the canonical row.
Projects
- Create a project when work starts. Type, name, manager, members.
- Update
phase,next_step,blockeras the work progresses. - File a weekly status update. ~60 seconds per project. Use the "Same as last week" button when nothing happened.
- Set
importanceandintensityto keep your dot plot honest. - Add
milestonesandkey_datesas they appear. - Attach links — data room, memo, legal, model, presentation — with their
link_status(working / final).
Hygiene
- Skip rules for vendor noise and recruiter outreach. Add from the Sync tab.
- Do-not-track addresses for correspondence you want kept out of Laurelin entirely (sensitive negotiation, personal mail at a work address).
- Merge duplicate companies when M&A or rebranding happens. Same one-click flow as people.
- Mark dead deals as
passedordeadrather than deleting. The history is the value.
Limitations — what Laurelin doesn't do
So you know where the system stops and your other tools begin.
By design
- It doesn't send anything. No email, no Slack reply, no Telegram message. Read-only across every connector. Drafts in Lost Threads are drafts — you copy them into Outlook yourself.
- It isn't your inbox. It logs interactions so you can find them later; it doesn't replace Outlook.
- It isn't a workflow tool. No assignable tasks, no kanban, no due-date reminders beyond key dates. Projects have a
next_stepand ablocker, and that's deliberate — work happens in heads and in Slack, Laurelin keeps the record. - It isn't connected to portfolio P&L. Portfolio Reports is a separate app.
- It doesn't store full email content. Bodies are summary-only (~255 chars). No attachments. If you need the original, it's still in Outlook.
Sync coverage gaps
- Slack DMs from people not yet in Laurelin require Sync Inbox approval. Channel chatter in mapped channels auto-logs.
- Telegram chats are opt-in per chat. The bot only sees chats you've toggled on. New chats appear only after the first message.
- Lost-thread detection is email-only. Slack DMs and Telegram chats aren't covered — the "X days without a reply" assumption doesn't hold there.
- Edited Telegram messages are ignored for now. Phase 4 will reconcile them.
- Personal mail from external domains to your work address still flows in if it slips past the header filter. Add the address to do-not-track if you want it dropped permanently.
Things you'd think happen but don't
- No auto-correct on misrouted interactions. If you edit one interaction's company, future emails from the same domain still route the old way. Fix the company's
email_domainsarray to fix the routing. - No automatic stage transitions. A company doesn't move from
exploringtoactivebecause a term sheet got sent — you make that call. - No bulk edit UI. Editing one record at a time is the norm. Engineering can run a script for anything broader.
- No mobile app. The web UI works on phones but isn't designed for it.
- No external-share view. Anything in Laurelin is internal. No client portal.
Privacy posture
- Internal team chatter is filtered out at ingest. Threads where every participant is
@valinordigital.comnever become interactions. - Do-not-track is per-address. It applies regardless of which company the address belongs to.
- Pause any connector any time from the Sync tab. Disconnect revokes the OAuth token; existing interactions stay.
The rhythm
If you internalize one habit per cadence, it's these.
Each morning
- Open the User Page. Skim what the system flagged.
- Open Sync Inbox. Triage anything new — usually a minute or two.
- Open Lost Threads if you're a heavy outbound sender. Emergencies first.
When you finish a call or meeting
- Log the interaction (if it didn't sync automatically). Type, date, company, participants, one or two sentences.
- Set
ball_withon the company. - If a next step came out of it, update
next_stepon the relevant project.
Each Monday
- File status updates on your projects. ~60s per project. Health + a sentence.
- Check
ball_with = usitems you've been sitting on.
Each month-ish
- Skim companies in
prospectandexploring— promote, demote, or markdormant. - Skim
key_datesin the next 30-60 days. Anything stale, update or remove. - Re-score
importance/intensityon your projects — the dot plot only works if these are honest.
When in doubt
- "Where do I log this thing that just happened?" → Interactions
- "How does this deal look?" → Pipeline
- "Filing this week's update on Project X" → Projects
- "Why isn't this email showing up in Laurelin?" → Sync
- "Someone sent me an email and I never replied" → Lost threads
- "Two people with the same name" → Contacts → merging
- "What does this term mean?" → Glossary
If you spend more than five minutes a day on Laurelin maintenance, something is misconfigured. Flag it in #laurelin and we'll fix it.