Lead
Data Entity
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.
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
Columns: email
idx_lead_masked_ref
Columns: masked_ref
idx_lead_status
Columns: status
idx_lead_created_at
Columns: created_at
idx_lead_organization_name
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
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
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
confirmation_email_dispatch
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
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
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