core PK: id 10 required 1 unique

Description

Prospective organization contacts captured through the product sales website demo booking flow and other inbound channels. Each lead represents a potential customer organization interested in the Meander platform, storing contact details, organization context, and sales qualification data to support the Norse Digital Products sales pipeline.

21
Attributes
6
Indexes
7
Validation Rules
9
CRUD Operations

Data Structure

Name Type Description Constraints
id uuid Unique identifier for the lead record
PKrequiredunique
first_name string First name of the contact person at the prospective organization
required
last_name string Last name of the contact person at the prospective organization
required
email string Business email address of the lead contact person, used for confirmation emails and sales follow-up
required
phone string Phone number of the lead contact person for sales outreach
-
organization_name string Name of the prospective organization interested in Meander
required
organization_type string Type or category of the prospective organization (e.g., non-profit, public sector, membership organization)
-
organization_size string Approximate number of peer mentors or volunteers the organization manages, used for sizing and pricing
-
role_title string Job title or role of the lead contact within their organization
-
source enum Channel through which the lead was acquired
required
status enum Current stage of the lead in the sales pipeline
required
notes text Free-text notes from sales team about the lead, conversation history, and qualification details
-
message text Initial message or inquiry submitted by the lead through the booking form
-
utm_source string UTM source parameter captured from the referring URL for marketing attribution
-
utm_medium string UTM medium parameter captured from the referring URL
-
utm_campaign string UTM campaign parameter captured from the referring URL
-
ip_address string IP address of the lead at form submission time, used for rate limiting and fraud detection
-
consent_given boolean Whether the lead explicitly consented to data processing and sales contact under GDPR
required
consent_timestamp datetime Timestamp when GDPR consent was recorded
-
created_at datetime Timestamp when the lead record was created
required
updated_at datetime Timestamp of the last modification to the lead record
required

Database Indexes

idx_leads_email
btree

Columns: email

idx_leads_status
btree

Columns: status

idx_leads_source
btree

Columns: source

idx_leads_created_at
btree

Columns: created_at

idx_leads_organization_name
btree

Columns: organization_name

idx_leads_status_created
btree

Columns: status, created_at

Validation Rules

email_format_validation error

Validation failed

required_fields_present error

Validation failed

phone_format_validation warning

Validation failed

message_length_limit error

Validation failed

xss_sanitization error

Validation failed

status_enum_validation error

Validation failed

consent_timestamp_consistency error

Validation failed

Business Rules

lead_deduplication_by_email
on_create

When a new lead is submitted with an email that already exists, link the new demo booking to the existing lead rather than creating a duplicate. Update the existing lead's updated_at timestamp and append to notes.

gdpr_consent_required
on_create

A lead record must not be created unless consent_given is true and consent_timestamp is set. Norwegian GDPR regulations require explicit opt-in before storing personal data for sales purposes.

status_transition_enforcement
on_update

Lead status transitions must follow a valid sequence: new → contacted → qualified → demo_scheduled → demo_completed → proposal_sent → negotiation → won/lost. Disqualified can be set from any status. Backwards transitions are not allowed except to disqualified or lost.

Enforced by: Booking Service
rate_limit_per_ip
on_create

No more than 5 lead submissions per IP address within a 1-hour window to prevent spam and abuse of the demo booking form.

Enforced by: Booking Service
lead_soft_delete_only
on_delete

Leads must never be hard-deleted from the database. Status should be set to disqualified or lost instead. GDPR erasure requests are handled by anonymizing PII fields while retaining the record for analytics.

Enforced by: Booking Service
confirmation_email_on_create
on_create

A confirmation email must be dispatched to the lead's email address immediately after a lead is created via the demo booking flow.

Storage Configuration

Storage Type
primary_table
Location
main_db
Partitioning
No Partitioning
Retention
Permanent Storage