CRM Standard Features
The CRM module provides standard customer management functionality added in February 2026.
Features Overview
| Feature | Table | Description |
|---|---|---|
| Notes | crm_notes | Comments, call logs, meeting records |
| Tags | crm_tags + crm_user_tags | Color-coded segmentation labels |
| Audit Log | crm_audit | Automatic action tracking |
| Addresses | crm_addresses | User addresses with types |
| Custom Fields | crm_field_defs + crm_field_values | Dynamic user attributes |
Notes
Attach notes to any CRM user. Supports multiple types:
| Type | Description |
|---|---|
| Comment | General text note |
| Call | Phone call record |
| Email interaction | |
| Meeting | Meeting notes |
| Task | Action item |
Features: CRUD operations, pinning, type filtering.
Tags / Segmentation
Color-coded tags for user segmentation:
- Define tags with colors and groups
- Assign multiple tags per user
- Filter users by tags
- Duplicate detection
Audit Log
Automatic fire-and-forget logging of CRM actions (writes go through AuditHelper).
Operator page: /CrmAdmin/AuditLog
The admin registry loads only after you apply at least one filter (HasAny in the page model). With no filters, the table stays empty by design.
| Query parameter | Purpose |
|---|---|
user_id | Target CRM user (crm_user.timetick) — rows where this user is the dossier subject |
actor_id | Acting CRM user (crm_user.timetick) — who performed the change |
action_type | Optional enum filter (see below) |
search | Substring match on details (SQL LIKE with surrounding %); [, %, and _ inside your input are escaped so they match literally |
limit | Max rows (default 200) |
Columns (newest first by created_date):
- Date — UTC (localized in the UI via shared admin scripts).
- Action —
CrmAuditActionvalue (badge styling per action). - User — subject user; links to
/CrmAdmin/UserDetail?timetick={user_id}when resolvable. - Actor — operator user, same link pattern, or system when
actor_idis not positive. - Details — free-text payload written at log time (profile updates, tag ids, external id types, etc.).
CrmAuditAction values (from platform Shared CRMClient enum): Created, Updated, StatusChanged, Merged, TagAssigned, TagRemoved, NoteAdded, ExidAdded, ExidVerified, ExidDeleted, AddressChanged.
ExidVerified (added 2026-05) is recorded when an operator presses "Mark verified" on /CrmAdmin/ExternalIds. Programmatic verification (OTP, magic link, OAuth handshake) does not write a separate audit row — the act of confirmation is itself the verification, and is captured in login_log.
For a full route map and links from EditUser, see CRM admin — operator guide.
Addresses
Multiple addresses per user with type classification:
- Types: Home, Work, Shipping, Billing
- Primary address flag
- Full address fields (street, city, country, postal code)
Custom Fields
Dynamic user attributes defined at runtime:
| Field Type | Example |
|---|---|
| String | Company name, Department |
| Number | Revenue, Employee count |
| Date | Contract date, Birthday |
| Bool | VIP status, Opted-in |
| Enum | Priority (Low/Medium/High) |
Define field definitions (crm_field_defs), then set values per user (crm_field_values).
Error Codes
| Code | Name | Description |
|---|---|---|
| 5006 | NoteNotFound | Note with given ID not found |
| 5007 | TagNotFound | Tag with given ID not found |
| 5008 | TagAlreadyAssigned | Tag already attached to user |
| 5009 | AddressNotFound | Address not found |
| 5010 | FieldDefNotFound | Custom field definition not found |
| 5011 | FieldValueInvalid | Value doesn't match field type |
Admin Pages
Razor pages under /CrmAdmin/ (see CRM module and CRM admin — operator guide):
- Notes — browse/create/edit/delete notes (requires at least one filter before listing)
- Tags — manage tag definitions and assignments
- AuditLog — filtered audit registry (see above)
- Addresses — user address management
- CustomFields — field definitions and values
- UserDetail — dossier with notes, tags, addresses, and related links