core PK: id 11 required 3 unique

Description

Represents a prospective organization that has expressed interest in the Meander platform, typically created when a decision-maker submits a demo booking form on the Product Sales Website. Captures contact details, organization context, and sales pipeline status to enable follow-up and conversion tracking.

18
Attributes
5
Indexes
8
Validation Rules
8
CRUD Operations

Data Structure

Name Type Description Constraints
id uuid Primary key, generated server-side on lead creation
PKrequiredunique
first_name string First name of the primary contact person submitting the inquiry
required
last_name string Last name of the primary contact person
required
email string Business email address of the primary contact. Used as the primary deduplication key for inbound leads
requiredunique
phone string Optional phone number of the primary contact, stored in E.164 format where possible
-
organization_name string Name of the prospective organization the contact represents
required
role_title string Job title or role of the primary contact within their organization (e.g., 'Koordinator', 'IT-ansvarlig', 'Daglig leder')
required
organization_size enum Approximate size of the prospective organization, used for sales qualification and pricing tier guidance
-
current_solution string Free-text description of the tool or process the organization currently uses for peer mentor management (e.g., 'Excel og Word-skjemaer', 'Ingen system'). Informs demo preparation
-
preferred_demo_timing string Free-text indication of preferred timing for the demo call, as entered in the booking form (e.g., 'Ukedager etter kl. 13')
-
notes text Additional context or questions submitted by the lead in the booking form's open notes field
-
status enum Current position of the lead in the sales pipeline. Transitions are managed manually by the Norse sales team
required
source enum Acquisition channel through which the lead was generated
required
masked_ref string Short opaque reference token included in confirmation URLs and emails to identify the lead without exposing the UUID. Generated at creation, used by the confirmation page
requiredunique
ip_address string IP address of the submitter at the time of form submission, stored for rate-limiting audit purposes
-
confirmation_sent_at datetime Timestamp when the confirmation email was successfully dispatched to the lead's email address. Null if email has not been sent yet
-
created_at datetime Timestamp when the lead record was created
required
updated_at datetime Timestamp of the most recent update to the lead record
required

Database Indexes

idx_lead_email
btree unique

Columns: email

idx_lead_masked_ref
btree unique

Columns: masked_ref

idx_lead_status
btree

Columns: status

idx_lead_created_at
btree

Columns: created_at

idx_lead_organization_name
btree

Columns: organization_name

Validation Rules

email_format error

Validation failed

required_fields_present error

Validation failed

email_length_limit error

Validation failed

name_field_length error

Validation failed

organization_name_length error

Validation failed

phone_format_if_provided error

Validation failed

notes_length_limit error

Validation failed

status_enum_constraint error

Validation failed

Business Rules

unique_email_per_lead
on_create

No two lead records may share the same email address. If a booking form is submitted with an existing email, the system updates the existing lead record rather than creating a duplicate, preserving the original created_at and incrementing the booking count

status_transition_ordering
on_update

Lead status must progress in forward order: new → contacted → qualified → demo_scheduled → converted or lost. Backward transitions (e.g., from 'converted' back to 'new') are not permitted

Enforced by: Booking Service
confirmation_email_dispatch
on_create

A confirmation email must be dispatched asynchronously to the lead's email address immediately after the lead record is persisted. If dispatch fails, the lead record is retained and the failure is logged for retry — the booking is not rolled back

rate_limit_per_ip
on_create

A maximum of 5 lead creation attempts per IP address within a 1-hour rolling window is enforced. Submissions exceeding this threshold are rejected with HTTP 429 before any database write occurs

masked_ref_immutability
on_update

The masked_ref field is generated once at creation and must never be changed. It is the stable identifier used in all external-facing URLs and email links

Storage Configuration

Storage Type
primary_table
Location
main_db
Partitioning
No Partitioning
Retention
Permanent Storage