Key Concepts
Contact
A contact represents a phone number in the system. Each contact stores:- Phone Number: In E.164 format (+14155551234)
- Custom Fields: Custom key-value pairs for targeting
- Engagement Data: Click history, conversion data, message counts
- Subscription Status: Active, opted-out, or invalid
Sending List
A sending list is a phone number you send messages from. Contacts subscribe to sending lists.ListContact
The relationship between a contact and a sending list. This tracks:- When the contact subscribed
- How they subscribed (API, import, journey)
- Current subscription status
- Opt-out timestamp (if applicable)
Contact Lifecycle
Creation
Contacts are created when you:
- Import a CSV file
- Add via API
- Receive an inbound message from a new number
Engagement
As you send messages, the contact accumulates engagement data: sends, clicks, conversions.
Contact Data Model
| Field | Location | Type | Description |
|---|---|---|---|
phone_number | Contact | String | E.164 format phone number |
email | Contact | String | Email address |
first_name | Contact | String | First name |
last_name | Contact | String | Last name |
timezone | Contact | String | Contact timezone |
carrier | Contact | String | Phone carrier |
line_type | Contact | String | Line type (mobile, voip, etc.) |
is_valid | Contact | Boolean | Number validation status |
created_at | Contact | DateTime | When first added |
custom_fields | ListContact | Object | Custom key-value pairs (per-list) |
send_count | ListContact | Integer | Messages sent to this contact |
click_count | ListContact | Integer | Link clicks from this contact |
revenue_total | ListContact | Float | Attributed revenue |
conversion_count | ListContact | Integer | Conversions attributed |
last_sent_at | ListContact | DateTime | Most recent message sent |
last_clicked_at | ListContact | DateTime | Most recent click |
last_revenue_at | ListContact | DateTime | Most recent revenue event |
signup_method | ListContact | String | How they subscribed (api, import, etc.) |
in_workflow | ListContact | Boolean | Currently in an active journey |
Working with Contacts
View Contacts
- Go to Sending Lists
- Click on a list
- View the Contacts tab
Contact Details
Click on any contact to see:- Full engagement history
- All custom fields and values
- Subscription status per list
- Message history
- Click and conversion events
Contact Status
| Status | Description | Can Receive Messages |
|---|---|---|
Active (active=True) | Subscribed and eligible | Yes |
Opted-Out (active=False, unsub_reason='message') | Replied STOP or opt-out keyword | No |
Bad Response (active=False, unsub_reason='bad_response') | Carrier rejection or repeated delivery failures | No |
Invalid Contact (active=False, unsub_reason='invalid_contact') | Number validation failed | No |
Manual (active=False, unsub_reason='manual') | Manually unsubscribed by admin or API | No |
Complaint (active=False, unsub_reason='complaint') | Spam complaint received | No |
Best Practices
Always use E.164 format
Always use E.164 format
Store numbers in E.164 format (+14155551234) for consistency. The platform normalizes imports automatically.
Use custom fields for segmentation
Use custom fields for segmentation
Add custom fields during import or via API to enable granular audience targeting later.
Monitor opt-out rates
Monitor opt-out rates
High opt-out rates can indicate messaging frequency issues or content problems. Aim for under 2%.
Clean your lists regularly
Clean your lists regularly
Remove invalid numbers and long-term non-engagers to improve deliverability and reduce costs.
Next Steps
Importing Contacts
Bulk import via CSV
Custom Fields
Organize with custom fields
Audiences
Target contact segments
API
Manage via API