The Contact Model
Contacts are the foundational entity in Gordon CRM. Every interaction — form submission, event registration, Stripe purchase, or manual entry — ultimately creates or updates a Contact record within your workspace.
Contact Fields
Every contact belongs to a single workspace and is uniquely identified by their email address within that workspace. Here is the full field reference:
| Field | Type | Description |
|---|---|---|
email | string | Required. The contact's email address. Unique per workspace. |
first_name | string | First name. |
last_name | string | Last name. |
phone | string | Phone number. |
source | enum | How the contact was created: manual, form, import, eventbrite, or stripe. |
address_line1 | string | Street address line 1. |
address_line2 | string | Street address line 2. |
city | string | City. |
state | string | State or province. |
postal_code | string | ZIP or postal code. |
country | string | Country. |
birth_month | integer | Birthday month (1–12). Must be paired with birth_day. |
birth_day | integer | Birthday day (1–31). Must be paired with birth_month. |
is_subscribed | boolean | Whether the contact has opted in to receive marketing emails. |
assigned_user_id | uuid | The workspace member this contact is assigned to. |
Consent & Opt-In Fields
These fields are automatically managed when a contact subscribes via a form or import. See the Subscriptions & Consent page for full details.
| Field | Type | Description |
|---|---|---|
opt_in_timestamp | timestamp | When consent was recorded. |
opt_in_source | string | Where consent originated (e.g., a form ID or "CSV Import"). |
opt_in_ip | string | The IP address at the time of consent. |
unsubscribed_at | timestamp | When the contact unsubscribed (null if still subscribed). |
Contact Sources
Contacts can enter your workspace through several channels:
| Source | How It Works |
|---|---|
| Manual | Created by a workspace member via the dashboard. |
| Form | Captured via a Gordon CRM headless form. New leads are processed immediately; existing contacts trigger a verification email. |
| Import | Uploaded via CSV using the bulk import pipeline. See CSV Import. |
| Eventbrite | Auto-synced when an attendee registers for a connected Eventbrite event. |
| Stripe | Auto-created when a new customer makes a purchase through a connected Stripe account. |
Workspace Isolation
Contacts are strictly isolated by workspace. Two different workspaces can each have a contact with jane@example.com — they are completely independent records with no data leakage between them.
This isolation is enforced at the database level using PostgreSQL Row-Level Security (RLS), meaning it cannot be bypassed by application bugs.
Related Entities
A single contact can be connected to many other records in Gordon CRM:
- Tags — Categorize contacts with colored labels. See Tags.
- Notes — Timestamped internal notes attached by team members (or automatically by form submissions).
- Companies — Link contacts to B2B company records with a job title and work email (requires the Companies module).
- Deals — Every deal in a pipeline must be linked to a contact (requires the Deals module).
- Appointments — Schedule meetings or service appointments for a contact (requires the Appointments module).
- Campaign Enrollments — Track which automated email sequences a contact is enrolled in.
- Event Registrations — Track which events a contact has attended and their payment status.
- Transactions — Stripe purchase history linked to this contact.
- Email Sends — A complete log of every email sent to this contact (campaigns, broadcasts, and transactional).
- Suppressions — Records of delivery issues (bounces, complaints) that prevent future sends. See Subscriptions & Consent.