Market & Intelligence Tables
Markets and signals are the core intelligence model in Client Portal. Markets define tightly scoped candidate segments. Signals capture structured intelligence extracted from call conversations.
markets
A market is a tightly defined candidate segment based on practice area, geography, seniority, and optionally firm tier. Markets are the fundamental unit of intelligence -- all signals roll up to a market.
| Column | Type | Nullable | Default | Description |
|---|---|---|---|---|
id | uuid | NO | gen_random_uuid() | Primary key |
client_id | uuid | NO | FK to clients.id | |
name | text | NO | Market name (e.g., Patent Litigation -- Multi-Market) | |
practice_area | text | YES | Primary practice area (e.g., M&A, Litigation, IP) | |
geography | text | YES | Geographic scope (e.g., NYC, Chicago, Texas, National) | |
seniority | text | YES | Target seniority (e.g., Associate, Senior Associate, Partner) | |
firm_tier | text | YES | Firm tier filter (e.g., amlaw_100, boutique) | |
status | text | YES | 'active' | active, paused, completed |
description | text | YES | Market description | |
created_at | timestamptz | YES | now() | |
updated_at | timestamptz | YES | now() |
Market names follow the format [Specialization] -- [Scope] using an em dash (not a hyphen). Each name must be unique. Examples:
Patent Litigation -- Multi-MarketM&A Associates -- New YorkWhite Collar Defense -- USA National
market_attorneys
Join table linking attorneys to markets. An attorney can belong to multiple markets, and a market contains many attorneys.
| Column | Type | Nullable | Default | Description |
|---|---|---|---|---|
id | uuid | NO | gen_random_uuid() | Primary key |
market_id | uuid | NO | FK to markets.id | |
attorney_id | uuid | NO | FK to attorneys.id | |
added_at | timestamptz | YES | now() | When the attorney was added to this market |
added_by | uuid | YES | FK to auth.users.id |
Unique constraint: (market_id, attorney_id) -- an attorney can only appear once per market.
signals
Structured market intelligence extracted from call conversations. Signals represent the commercial meaning behind a call -- movement state, timing, motivation, and relationship quality.
| Column | Type | Nullable | Default | Description |
|---|---|---|---|---|
id | uuid | NO | gen_random_uuid() | Primary key |
call_id | uuid | YES | FK to calls.id (source evidence) | |
market_id | uuid | YES | FK to markets.id | |
contact_id | uuid | YES | FK to contacts.id | |
movement_state | text | YES | Movement intent (see table below) | |
timing_window | text | YES | Expected timing for movement | |
motivation_driver | text | YES | Primary motivation for considering a move | |
conversation_access | text | YES | How open the candidate was to conversation | |
relationship_permission | text | YES | Relationship depth achieved | |
firm_stability | text | YES | Stability signal about the candidate's current firm | |
authorized | boolean | YES | false | Whether this signal has been authorized as trusted truth |
authorized_by | uuid | YES | FK to auth.users.id (who authorized) | |
authorized_at | timestamptz | YES | When authorized | |
notes | text | YES | Additional context | |
created_at | timestamptz | YES | now() | |
updated_at | timestamptz | YES | now() |
Signal Field Values
Movement State
| Value | Description |
|---|---|
Not Moving | No intent to change firms |
Soft Listening | Open to hearing about opportunities but not actively seeking |
Exploring | Actively evaluating options |
Active | Actively interviewing or in process |
Timing Window
| Value | Description |
|---|---|
Now | Ready to move immediately |
0-3 months | Likely to move within the quarter |
3-6 months | Considering movement in the medium term |
6-12 months | Longer-term consideration |
12+ months | Not considering for at least a year |
Motivation Driver
| Value | Description |
|---|---|
Compensation | Pay is the primary driver |
Promotion | Seeking advancement/partnership track |
Platform | Wants a different firm platform or client base |
Culture | Unhappy with firm culture |
Burnout | Overworked or burned out |
Geography | Wants to relocate |
Stability | Concerned about firm stability |
Conversation Access
| Value | Description |
|---|---|
Closed | Would not engage in conversation |
Neutral | Engaged politely but did not share |
Open | Openly discussed career situation |
Relationship Permission
| Value | Description |
|---|---|
Closed | Does not want further contact |
Warm | Open to future outreach |
Relationship Building | Actively building rapport |
Trusted | High-trust relationship established |
Firm Stability
| Value | Description |
|---|---|
Positive | Firm is stable and growing |
Stable | No notable changes |
Negative | Firm issues (departures, financial concerns, restructuring) |
Unknown | No information available |
Intelligence Authority Model
Signals are AI-generated drafts until explicitly authorized by setting authorized = true. Only authorized signals should be presented to clients as trusted intelligence. The authorized_by field tracks who approved the signal.