Data Model
Complete schema reference for the Dealix platform. All tenant-scoped tables include a tenant_id foreign key. Timestamps (created_at, updated_at) are present on every table unless noted.
Core Tables
users
| Field |
Type |
Notes |
| id |
UUID |
PK |
| tenant_id |
UUID |
FK -> tenants |
| email |
VARCHAR(255) |
unique per tenant |
| phone |
VARCHAR(20) |
|
| hashed_password |
TEXT |
|
| full_name |
VARCHAR(255) |
|
| role |
ENUM |
owner, admin, manager, agent, affiliate, viewer |
| language |
VARCHAR(5) |
ar, en |
| is_active |
BOOLEAN |
|
| last_login_at |
TIMESTAMP |
|
tenants
| Field |
Type |
Notes |
| id |
UUID |
PK |
| name |
VARCHAR(255) |
|
| slug |
VARCHAR(100) |
unique |
| plan |
ENUM |
free, starter, pro, enterprise |
| domain |
VARCHAR(255) |
custom domain |
| settings |
JSONB |
tenant-level config |
| is_active |
BOOLEAN |
|
leads
| Field |
Type |
Notes |
| id |
UUID |
PK |
| tenant_id |
UUID |
FK -> tenants |
| assigned_to |
UUID |
FK -> users |
| source |
VARCHAR(50) |
whatsapp, web, referral, import, affiliate |
| status |
ENUM |
new, contacted, qualified, converted, lost |
| score |
INTEGER |
AI-computed 0-100 |
| full_name |
VARCHAR(255) |
|
| phone |
VARCHAR(20) |
|
| email |
VARCHAR(255) |
|
| company_name |
VARCHAR(255) |
|
| sector |
VARCHAR(100) |
|
| city |
VARCHAR(100) |
|
| notes |
TEXT |
|
| qualified_at |
TIMESTAMP |
|
| converted_at |
TIMESTAMP |
|
deals
| Field |
Type |
Notes |
| id |
UUID |
PK |
| tenant_id |
UUID |
FK -> tenants |
| lead_id |
UUID |
FK -> leads |
| assigned_to |
UUID |
FK -> users |
| title |
VARCHAR(255) |
|
| stage |
ENUM |
discovery, proposal, negotiation, closed_won, closed_lost |
| value |
DECIMAL(12,2) |
SAR |
| currency |
VARCHAR(3) |
default SAR |
| probability |
INTEGER |
0-100 |
| expected_close |
DATE |
|
| closed_at |
TIMESTAMP |
|
| lost_reason |
TEXT |
|
customers
| Field |
Type |
Notes |
| id |
UUID |
PK |
| tenant_id |
UUID |
FK -> tenants |
| lead_id |
UUID |
FK -> leads |
| deal_id |
UUID |
FK -> deals |
| full_name |
VARCHAR(255) |
|
| email |
VARCHAR(255) |
|
| phone |
VARCHAR(20) |
|
| company_name |
VARCHAR(255) |
|
| lifetime_value |
DECIMAL(12,2) |
|
activities
| Field |
Type |
Notes |
| id |
UUID |
PK |
| tenant_id |
UUID |
FK -> tenants |
| user_id |
UUID |
FK -> users |
| lead_id |
UUID |
FK -> leads, nullable |
| deal_id |
UUID |
FK -> deals, nullable |
| type |
ENUM |
call, email, whatsapp, meeting, note, task |
| subject |
VARCHAR(255) |
|
| body |
TEXT |
|
| scheduled_at |
TIMESTAMP |
|
| completed_at |
TIMESTAMP |
|
messages
| Field |
Type |
Notes |
| id |
UUID |
PK |
| tenant_id |
UUID |
FK -> tenants |
| lead_id |
UUID |
FK -> leads, nullable |
| contact_id |
UUID |
FK -> contacts, nullable |
| channel |
ENUM |
whatsapp, email, sms, in_app |
| direction |
ENUM |
inbound, outbound |
| content |
TEXT |
|
| status |
ENUM |
queued, sent, delivered, read, failed |
| sent_at |
TIMESTAMP |
|
proposals
| Field |
Type |
Notes |
| id |
UUID |
PK |
| tenant_id |
UUID |
FK -> tenants |
| deal_id |
UUID |
FK -> deals |
| version |
INTEGER |
|
| title |
VARCHAR(255) |
|
| content |
JSONB |
structured proposal data |
| status |
ENUM |
draft, sent, viewed, accepted, rejected |
| sent_at |
TIMESTAMP |
|
| viewed_at |
TIMESTAMP |
|
notifications
| Field |
Type |
Notes |
| id |
UUID |
PK |
| tenant_id |
UUID |
FK -> tenants |
| user_id |
UUID |
FK -> users |
| type |
VARCHAR(50) |
|
| title |
VARCHAR(255) |
|
| body |
TEXT |
|
| channel |
ENUM |
in_app, email, whatsapp, sms |
| is_read |
BOOLEAN |
|
| read_at |
TIMESTAMP |
|
subscriptions
| Field |
Type |
Notes |
| id |
UUID |
PK |
| tenant_id |
UUID |
FK -> tenants |
| plan |
ENUM |
free, starter, pro, enterprise |
| status |
ENUM |
active, past_due, cancelled, trialing |
| current_period_start |
TIMESTAMP |
|
| current_period_end |
TIMESTAMP |
|
| payment_provider |
VARCHAR(50) |
|
| external_id |
VARCHAR(255) |
provider subscription ID |
templates
| Field |
Type |
Notes |
| id |
UUID |
PK |
| tenant_id |
UUID |
FK -> tenants, nullable (global templates) |
| type |
ENUM |
whatsapp, email, sms, proposal |
| name |
VARCHAR(255) |
|
| language |
VARCHAR(5) |
ar, en |
| subject |
VARCHAR(255) |
|
| body |
TEXT |
supports variables |
| is_active |
BOOLEAN |
|
properties
| Field |
Type |
Notes |
| id |
UUID |
PK |
| tenant_id |
UUID |
FK -> tenants |
| entity_type |
VARCHAR(50) |
lead, deal, contact, company |
| entity_id |
UUID |
|
| key |
VARCHAR(100) |
|
| value |
TEXT |
|
audit_logs
| Field |
Type |
Notes |
| id |
UUID |
PK |
| tenant_id |
UUID |
FK -> tenants |
| user_id |
UUID |
FK -> users |
| action |
VARCHAR(50) |
create, update, delete, login, export |
| entity_type |
VARCHAR(50) |
|
| entity_id |
UUID |
|
| changes |
JSONB |
before/after diff |
| ip_address |
VARCHAR(45) |
|
Affiliate Tables
affiliates
| Field |
Type |
Notes |
| id |
UUID |
PK |
| tenant_id |
UUID |
FK -> tenants |
| user_id |
UUID |
FK -> users |
| status |
ENUM |
applied, approved, active, suspended, terminated |
| tier |
ENUM |
bronze, silver, gold, platinum |
| referral_code |
VARCHAR(20) |
unique |
| commission_rate |
DECIMAL(5,2) |
percentage |
| approved_at |
TIMESTAMP |
|
affiliate_performances
| Field |
Type |
Notes |
| id |
UUID |
PK |
| affiliate_id |
UUID |
FK -> affiliates |
| period |
DATE |
month start |
| leads_generated |
INTEGER |
|
| deals_closed |
INTEGER |
|
| revenue_attributed |
DECIMAL(12,2) |
|
| commission_earned |
DECIMAL(12,2) |
|
| conversion_rate |
DECIMAL(5,2) |
|
affiliate_deals
| Field |
Type |
Notes |
| id |
UUID |
PK |
| affiliate_id |
UUID |
FK -> affiliates |
| deal_id |
UUID |
FK -> deals |
| lead_id |
UUID |
FK -> leads |
| attributed_revenue |
DECIMAL(12,2) |
|
| commission_amount |
DECIMAL(12,2) |
|
| status |
ENUM |
pending, confirmed, paid, disputed |
AI Tables
ai_conversations
| Field |
Type |
Notes |
| id |
UUID |
PK |
| tenant_id |
UUID |
FK -> tenants |
| agent_type |
VARCHAR(50) |
agent identifier |
| lead_id |
UUID |
FK -> leads, nullable |
| contact_id |
UUID |
FK -> contacts, nullable |
| input_payload |
JSONB |
|
| output_payload |
JSONB |
|
| tokens_used |
INTEGER |
|
| latency_ms |
INTEGER |
|
| status |
ENUM |
success, error, escalated |
auto_bookings
| Field |
Type |
Notes |
| id |
UUID |
PK |
| tenant_id |
UUID |
FK -> tenants |
| lead_id |
UUID |
FK -> leads |
| agent_id |
UUID |
FK -> users (assigned agent) |
| proposed_time |
TIMESTAMP |
|
| confirmed_time |
TIMESTAMP |
|
| status |
ENUM |
proposed, confirmed, rescheduled, cancelled, completed |
| channel |
VARCHAR(20) |
whatsapp, email |
| calendar_event_id |
VARCHAR(255) |
external calendar ref |
New Tables
companies
| Field |
Type |
Notes |
| id |
UUID |
PK |
| tenant_id |
UUID |
FK -> tenants |
| name |
VARCHAR(255) |
|
| name_ar |
VARCHAR(255) |
Arabic name |
| sector |
VARCHAR(100) |
|
| size |
ENUM |
micro, small, medium, large, enterprise |
| city |
VARCHAR(100) |
|
| region |
VARCHAR(100) |
|
| cr_number |
VARCHAR(20) |
commercial registration |
| website |
VARCHAR(255) |
|
| is_active |
BOOLEAN |
|
contacts
| Field |
Type |
Notes |
| id |
UUID |
PK |
| tenant_id |
UUID |
FK -> tenants |
| company_id |
UUID |
FK -> companies, nullable |
| lead_id |
UUID |
FK -> leads, nullable |
| full_name |
VARCHAR(255) |
|
| job_title |
VARCHAR(100) |
|
| email |
VARCHAR(255) |
|
| phone |
VARCHAR(20) |
|
| whatsapp |
VARCHAR(20) |
|
| language |
VARCHAR(5) |
ar, en |
| consent_status |
ENUM |
granted, revoked, pending |
prospects
| Field |
Type |
Notes |
| id |
UUID |
PK |
| tenant_id |
UUID |
FK -> tenants |
| company_id |
UUID |
FK -> companies, nullable |
| contact_id |
UUID |
FK -> contacts, nullable |
| source |
VARCHAR(50) |
|
| status |
ENUM |
identified, researching, approaching, engaged, disqualified |
| priority |
ENUM |
low, medium, high, critical |
| sector |
VARCHAR(100) |
|
| estimated_value |
DECIMAL(12,2) |
|
| notes |
TEXT |
|
calls
| Field |
Type |
Notes |
| id |
UUID |
PK |
| tenant_id |
UUID |
FK -> tenants |
| lead_id |
UUID |
FK -> leads, nullable |
| contact_id |
UUID |
FK -> contacts, nullable |
| user_id |
UUID |
FK -> users |
| direction |
ENUM |
inbound, outbound |
| status |
ENUM |
ringing, answered, missed, voicemail, failed |
| duration_seconds |
INTEGER |
|
| recording_url |
TEXT |
|
| transcript |
TEXT |
AI-generated |
| sentiment |
VARCHAR(20) |
positive, neutral, negative |
| outcome |
VARCHAR(50) |
|
commissions
| Field |
Type |
Notes |
| id |
UUID |
PK |
| tenant_id |
UUID |
FK -> tenants |
| affiliate_id |
UUID |
FK -> affiliates |
| deal_id |
UUID |
FK -> deals |
| amount |
DECIMAL(12,2) |
|
| currency |
VARCHAR(3) |
SAR |
| rate |
DECIMAL(5,2) |
percentage applied |
| status |
ENUM |
pending, approved, paid, disputed, cancelled |
| approved_by |
UUID |
FK -> users, nullable |
| approved_at |
TIMESTAMP |
|
| period |
DATE |
commission period |
payouts
| Field |
Type |
Notes |
| id |
UUID |
PK |
| tenant_id |
UUID |
FK -> tenants |
| affiliate_id |
UUID |
FK -> affiliates |
| amount |
DECIMAL(12,2) |
|
| currency |
VARCHAR(3) |
|
| method |
ENUM |
bank_transfer, wallet, check |
| status |
ENUM |
pending, processing, completed, failed |
| reference |
VARCHAR(100) |
payment reference |
| bank_name |
VARCHAR(100) |
|
| iban |
VARCHAR(34) |
|
| processed_at |
TIMESTAMP |
|
disputes
| Field |
Type |
Notes |
| id |
UUID |
PK |
| tenant_id |
UUID |
FK -> tenants |
| commission_id |
UUID |
FK -> commissions, nullable |
| affiliate_id |
UUID |
FK -> affiliates |
| type |
ENUM |
commission, attribution, payout, guarantee |
| status |
ENUM |
open, under_review, resolved, escalated, closed |
| description |
TEXT |
|
| resolution |
TEXT |
|
| resolved_by |
UUID |
FK -> users, nullable |
| resolved_at |
TIMESTAMP |
|
guarantee_claims
| Field |
Type |
Notes |
| id |
UUID |
PK |
| tenant_id |
UUID |
FK -> tenants |
| deal_id |
UUID |
FK -> deals |
| customer_id |
UUID |
FK -> customers |
| claim_type |
ENUM |
performance, quality, delivery, other |
| status |
ENUM |
submitted, reviewing, approved, denied, refunded |
| description |
TEXT |
|
| evidence |
JSONB |
uploaded proof references |
| amount_claimed |
DECIMAL(12,2) |
|
| amount_approved |
DECIMAL(12,2) |
|
| reviewed_by |
UUID |
FK -> users, nullable |
| reviewed_at |
TIMESTAMP |
|
refunds
| Field |
Type |
Notes |
| id |
UUID |
PK |
| tenant_id |
UUID |
FK -> tenants |
| guarantee_claim_id |
UUID |
FK -> guarantee_claims |
| deal_id |
UUID |
FK -> deals |
| amount |
DECIMAL(12,2) |
|
| currency |
VARCHAR(3) |
|
| status |
ENUM |
pending, processing, completed, failed |
| method |
ENUM |
bank_transfer, original_method, wallet |
| processed_at |
TIMESTAMP |
|
| reference |
VARCHAR(100) |
|
consents
| Field |
Type |
Notes |
| id |
UUID |
PK |
| tenant_id |
UUID |
FK -> tenants |
| contact_id |
UUID |
FK -> contacts |
| channel |
ENUM |
whatsapp, email, sms, phone |
| status |
ENUM |
granted, revoked |
| granted_at |
TIMESTAMP |
|
| revoked_at |
TIMESTAMP |
|
| ip_address |
VARCHAR(45) |
|
| source |
VARCHAR(50) |
how consent was collected |
complaints
| Field |
Type |
Notes |
| id |
UUID |
PK |
| tenant_id |
UUID |
FK -> tenants |
| contact_id |
UUID |
FK -> contacts, nullable |
| customer_id |
UUID |
FK -> customers, nullable |
| category |
ENUM |
service, billing, communication, privacy, other |
| status |
ENUM |
open, investigating, resolved, closed |
| severity |
ENUM |
low, medium, high, critical |
| description |
TEXT |
|
| resolution |
TEXT |
|
| assigned_to |
UUID |
FK -> users, nullable |
| resolved_at |
TIMESTAMP |
|
policies
| Field |
Type |
Notes |
| id |
UUID |
PK |
| tenant_id |
UUID |
FK -> tenants, nullable (platform-wide) |
| type |
ENUM |
commission, guarantee, refund, compliance, privacy |
| name |
VARCHAR(255) |
|
| content |
TEXT |
|
| version |
INTEGER |
|
| is_active |
BOOLEAN |
|
| effective_from |
DATE |
|
knowledge_articles
| Field |
Type |
Notes |
| id |
UUID |
PK |
| tenant_id |
UUID |
FK -> tenants, nullable (shared) |
| category |
VARCHAR(100) |
|
| title |
VARCHAR(255) |
|
| title_ar |
VARCHAR(255) |
|
| body |
TEXT |
|
| body_ar |
TEXT |
|
| embedding |
VECTOR(1536) |
for RAG retrieval |
| sector |
VARCHAR(100) |
nullable |
| is_published |
BOOLEAN |
|
sector_assets
| Field |
Type |
Notes |
| id |
UUID |
PK |
| tenant_id |
UUID |
FK -> tenants, nullable |
| sector |
VARCHAR(100) |
|
| asset_type |
ENUM |
pitch_deck, case_study, objection_map, pricing_guide, competitor_matrix |
| title |
VARCHAR(255) |
|
| content |
JSONB |
structured asset data |
| language |
VARCHAR(5) |
ar, en |
| is_active |
BOOLEAN |
|
scorecards
| Field |
Type |
Notes |
| id |
UUID |
PK |
| tenant_id |
UUID |
FK -> tenants |
| user_id |
UUID |
FK -> users |
| period |
DATE |
scoring period |
| leads_handled |
INTEGER |
|
| deals_closed |
INTEGER |
|
| revenue_generated |
DECIMAL(12,2) |
|
| avg_response_time |
INTEGER |
seconds |
| customer_satisfaction |
DECIMAL(3,2) |
0.00-5.00 |
| ai_assist_rate |
DECIMAL(5,2) |
percentage of AI-assisted interactions |
| composite_score |
DECIMAL(5,2) |
weighted aggregate |
Entity Relationships
tenants 1--* users
tenants 1--* leads
tenants 1--* deals
tenants 1--* companies
tenants 1--* contacts
leads *--1 users (assigned_to)
leads 1--* deals
leads 1--* activities
leads 1--* messages
leads 1--* ai_conversations
leads 1--* auto_bookings
leads 1--* calls
deals 1--* proposals
deals 1--* commissions
deals 1--* guarantee_claims
companies 1--* contacts
contacts 1--* messages
contacts 1--* calls
contacts 1--* consents
affiliates 1--1 users
affiliates 1--* affiliate_deals
affiliates 1--* affiliate_performances
affiliates 1--* commissions
affiliates 1--* payouts
affiliates 1--* disputes
guarantee_claims 1--* refunds
commissions 1--* disputes