Data model

Main relationships

  • Company ← (many) Customer ← (many) Contact (email / linkedin URL / phone / telegram chat ID)
  • CustomerTag (many-to-many, free-form + bot: system prefix for autoreply control)
  • CustomerSegment (membership; static or dynamic)
  • CustomerFitAssessment (score per criterion per product, with history)
  • CustomerActivityLog (every event)
  • CustomerNote (markdown, internal)
  • CustomerTask (to-do items)
  • DealCustomer (primary contact) + Company
  • DealDealStage enum (open / negotiating / won / lost)

CRM tabs

Customers

The main contact book. Detail drawer with 4 tabs. Bulk operations.

Companies

Legal entities. Merge, domain auto-match.

Segments

Static + dynamic. Targets for campaigns.

Deals

Pipeline kanban + list. Stage tracking.

Leads

Customer fit ranking per product, human review.

Tasks

Pool + assigned. Polymorphic anchor.

Notes

Internal markdown. Per customer / deal / company.

Tags

Tag library. System tags + custom.

Scoring

Fit criteria + assessments per product.

Core principles

A customer is a person; a contact is a channel. One customer can have 3 contacts (work email, personal email, LinkedIn). When sending a message, automation picks a channel + credential; the channel maps to the matching contact on that customer.
No hard-delete on customers. EDGR disallows it — it breaks relationships with deals, activity logs, and segment history. Instead archive (soft hide) or use the Exit — Suppress node to stop outreach.

Ownership scoping (WIP)

RoleCustomerDealInbox
owner / adminread + write org-wideread + write org-wideread + reply org-wide
memberread org-wide, write own or unclaimedsamereply own or pool
Customer.claimedById = the sales-rep owner. Set via:
  • Sales rep claims from the drawer
  • The assign-owner automation node
  • Bulk claim from the customer table

Activity log

Every customer event is logged. Each entry has:
  • The customer involved
  • An event type (discriminator)
  • Per-type detail data
  • A timestamp

Event types recorded

GroupTypes
Emailsent, opened, clicked, replied, bounced
LinkedIn / Telegramsent, replied
Tagadded, removed
Segmentjoined, left
Botreplied, escalated
Taskcreated, completed
Ownerclaimed, released
Profilescored
Noteadded
Dealcreated

Timeline

The customer drawer’s Activity tab merges every event and message by time. Filters: event type, channel, date range.