CRM Update Strategy
Version 1.1.0 • Updated after live schema + data-source audit • Twenty CRM — Calibrax workspace
The Cardinal Rule
What Belongs in This Workspace
1. Calibrax-Exclusive Contacts
- Calibrax clients and prospects
- Calibrax partners and vendors
- Calibrax recruiting pipeline
- Calibrax investors and advisors
2. Neutral Shared Contacts
Contacts that genuinely serve both companies, where both sides know about the dual role:
- Shared service providers (accountants, lawyers, cloud vendors)
- Mutual investors who know about both ventures
- Personal network contacts aware of both companies
- Kelvin's own relationships where disclosure is explicit
3. Personal / Undecided Pipeline
- Early-stage leads where the company is not yet determined
- Personal brand/network contacts not yet assigned to either company
- Tag clearly so they can be migrated later
What Stays OUT
IIMMPACT-Exclusive Data
- IIMMPACT client companies and contacts
- IIMMPACT deal pipeline, stages, amounts, close dates
- IIMMPACT pricing, contract terms, renewals
- IIMMPACT internal strategic notes
- IIMMPACT hiring pipeline
- Any IIMMPACT-only relationship where the other party doesn't know about Calibrax
Sensitive Personal Contacts
- Contacts where Kelvin has not disclosed his dual role
- Family / personal contacts that don't need CRM tracking
- Government, regulatory, or high-privacy-expectation contacts
Data Source Mapping
| Source | IIMMPACT Account | Calibrax Account | CRM Ingestion Rule |
|---|---|---|---|
| Gmail | primary-gmail → kelvin@iimmpact.com | secondary-gmail → kelvin.lee@calibrax.ai | Twenty CRM: use secondary-gmail only |
| Calendar | calendar_id: "kelvin.lee@iimmpact.com" (primary) | calendar_id: "kelvin.lee@calibrax.ai" (reader) | Twenty CRM: query kelvin.lee@calibrax.ai only |
| Drive | primary-drive → IIMMPACT Drive | Not connected | Twenty CRM: do not ingest from Drive until Calibrax Drive is connected |
primary-calendar Composio account is connected to Kelvin's Google account (kelvin.lee@iimmpact.com), which has access to multiple calendars. The Calibrax calendar (kelvin.lee@calibrax.ai) is a separate calendar that Kelvin has reader access to. It appears alongside the IIMMPACT calendar in the Google Calendar UI, but it is a distinct calendar_id in the API.
Ingestion Rules
Gmail
- Calibrax-related threads → Use
--account secondary-gmail→ Log contacts to Twenty - IIMMPACT-related threads → Use
--account primary-gmail→ Log to local notes, flag for IIMMPACT CRM - Neutral/shared contacts → Use appropriate account based on sender domain → Log to Twenty with
[Neutral]prefix
Calendar
- Query
calendar_id: "kelvin.lee@calibrax.ai"for Calibrax events → Extract attendees, create/update Twenty contacts - Query
calendar_id: "primary"or"kelvin.lee@iimmpact.com"for IIMMPACT events → Do NOT auto-log to Twenty - Calibrax meeting attendees → Auto-log if not already in CRM
- IIMMPACT meeting attendees → Do NOT auto-log to Twenty
Drive
primary-driveis connected to IIMMPACT Drive. Do not use for Twenty CRM ingestion.- When Calibrax Drive is connected, add it as a separate account and use for Calibrax document-based CRM updates.
Email-Based Company Classification
| Signal | Classification |
|---|---|
Sender domain is @iimmpact.com or @iimmpact.co | IIMMPACT internal → skip CRM |
Sender domain is @calibrax.ai | Calibrax internal → skip CRM (unless external attendee) |
External sender, thread includes @calibrax.ai recipients | Calibrax → log to Twenty |
External sender, thread includes @iimmpact.com recipients | IIMMPACT → do NOT log to Twenty |
| External sender, thread includes both | Neutral/shared → log to Twenty with [Neutral] |
| Unclear from thread participants | Flag for manual review, do not auto-log |
Calendar-Based Company Classification
| Signal | Classification |
|---|---|
Event on kelvin.lee@calibrax.ai calendar | Calibrax event → ingest into Twenty |
Event on kelvin.lee@iimmpact.com (primary) calendar | IIMMPACT event → do NOT ingest |
Attendees include @calibrax.ai and no @iimmpact.com | Calibrax → ingest |
Attendees include @iimmpact.com and no @calibrax.ai | IIMMPACT → skip |
| Attendees include both domains | Neutral/shared → ingest with [Neutral] |
| Event title/description contains "Calibrax" | Calibrax → ingest |
| Event title/description contains "IIMMPACT" | IIMMPACT → skip |
Logging Workflow
When to Log a Contact
Log when:
- A meaningful business interaction occurs (email, meeting, call)
- There is ongoing or expected follow-up
- The relationship is stable enough to justify structured tracking
- It passes the golden test above
Do NOT log:
- One-off inbound inquiries with no follow-up expected
- Contacts from mass events where no 1:1 relationship exists yet
- Contacts you haven't interacted with in 12+ months
- Any IIMMPACT-exclusive contact
When to Log an Opportunity
- A deal is active (not just "might happen someday")
- There is a known company/contact, product, and rough value
- There is a next step or expected close timeline
- The deal belongs to Calibrax (or is neutral/undecided)
Minimum Data to Capture
Person: Name (first + last), primary email, company link, job title, source of introduction
Company: Name, domain name, industry/description, country/region
Opportunity: Name, stage, amount (if known), close date (if known), linked company/person
There is no
CLOSED_LOST stage. Dead deals must be deleted or left in PROPOSAL. This is a known limitation for B2B sales cycles.
Tagging & Classification
Twenty has no custom tags or custom fields. Use notes with prefixed context:
[IIMMPACT] — DO NOT put in this workspace; keep in local notes
[Neutral] — Shared contact, both companies aware
[Personal] — Kelvin's personal relationship, not yet assigned
- No custom fields on People, Companies, or Opportunities
- No tags or labels
- No validation rules (anyone can create a record with no email, no amount)
- No automatic duplicate prevention at entry time
Intake Source Tracking
Twenty records createdBy.source automatically. This is immutable:
Implication: When I log a contact from an email thread, the source shows EMAIL or API, not the actual origin (e.g., "Money20/20 conference," "YC referral"). Use notes to capture true attribution. There is no custom source field.
Deduplication
- Prevention: None. The same email can create multiple person records.
- Detection:
personDuplicatesandcompanyDuplicatesqueries exist, but require passing data/IDs to check — not automatic scanners. - Resolution:
mergePeoplemutation can merge two person records. Use during monthly hygiene.
twenty people search --query "<email>" --limit 10If a match exists, do not create a duplicate.
Workflow Automation
Twenty has a built-in workflow engine:
- Triggers:
DATABASE_EVENT(record changes) andCRON(scheduled) - Use case: "When opportunity moves to PROPOSAL, create a follow-up task for Kelvin"
- Reality: Building workflows via API is JSON-heavy. Use the Twenty UI for design. The API is for inspection/triggering, not easy authoring.
Workflow statuses: DRAFT ACTIVE DEACTIVATED
Run statuses: NOT_STARTED RUNNING COMPLETED FAILED ENQUEUED STOPPING STOPPED
Task Discipline
Task statuses are simple and effective:
IN_PROGRESS — Active
DONE — Complete
Use tasks for every concrete next action with a deadline. Link them to the relevant person, company, or opportunity.
Checking Before Logging
- Which company does this belong to? → Calibrax, IIMMPACT, or neutral?
- If IIMMPACT, is there another place for it? → Yes: local markdown, Notion, Airtable, or a separate CRM.
- Would YC be surprised or concerned to see this? → If yes, do not log it here. (Alex is dual-role; YC is the Calibrax-only member.)
Maintenance Cadence
Weekly (Every Friday)
- Review new contacts logged this week. Verify company assignment is correct.
- Review open opportunities. Update stages, amounts, close dates if changed.
- Review overdue tasks. Close completed, reschedule or cancel stale ones.
Monthly (First Monday)
- Pipeline review: stage distribution, stale opportunities (>90 days no activity)
- Data hygiene: duplicate people/companies, missing emails, incomplete records
- Export backup:
twenty people list --limit 200 > /tmp/twenty_people_$(date +%Y%m).json
Future State: IIMMPACT CRM
When IIMMPACT gets its own CRM (separate Twenty workspace, HubSpot, or other):
- Export neutral/shared contacts from this workspace
- Import into IIMMPACT CRM
- Update this skill to reflect the new dual-CRM architecture
- Update workflows to route IIMMPACT contacts to the correct system
Until then, IIMMPACT contacts live in:
- Local markdown notes (
~/notes/iimmpact/) - Notion or Airtable (if Kelvin sets one up)
- Kelvin's personal memory / email archives
Emergency: Accidental IIMMPACT Data in Twenty
- Immediately delete the record:
twenty people delete --id <uuid> twenty companies delete --id <uuid>
- If linked notes/opportunities exist, delete those first (or they will orphan)
- Log the incident locally for awareness
- Review what was exposed and whether any follow-up is needed
Skill Invocation
Use this skill when:
- Kelvin asks to log a new contact, company, or deal
- Processing email/calendar data that might contain CRM-worthy contacts
- Reviewing pipeline or preparing for a meeting
- Deciding where a piece of business information should live
- Setting up CRM integrations or automations
Skill: crm-update-strategy — Category: personal-agent-stack — Related: twenty-crm, composio, gmail-composio-guide, google-calendar-composio-guide