Privacy and storage
- PII (name, email, phone) is encrypted at rest with AES-256-GCM and is workspace-scoped — no cross-tenant access.
- Email can be indexed for deduplication via HMAC-SHA-256 hash; phone lookups use contact id after resolution.
- PII fields are never exposed in analytics or webhook payloads beyond the workspace that owns them.
Contact record shape
Consent model
Consent is per channel, per message type — not a single boolean flag. Each consent record inconsent_records[] carries:
| Field | Meaning |
|---|---|
channel_type | EMAIL, RCS, or SMS |
message_type | MESSAGE (action-based) or NEWSLETTER (subscription) |
status | GRANTED — active. REVOKED — blocked. PENDING — DOI awaiting confirmation |
source | Where consent came from: landing_page, csv_import, api, crm_sync |
proof_text | Human-readable audit note — form URL, checkbox label, email subject |
enforced_doi | true if Double Opt-In confirmation was required |
doi_status | DOI_SEND (confirmation dispatched) or DOI_ACCEPTED (confirmed). null if DOI not enforced |
doi_channel | Channel used to deliver the DOI confirmation: EMAIL, RCS, SMS. null if no DOI |
granted_at | Timestamp when consent became GRANTED. null while still PENDING |
revoked_at | Timestamp when consent was revoked. null if still active |
GRANTED consent record for the relevant channel_type + message_type combination return 422. Opt-out events (unsubscribes, complaints) set the record to REVOKED immediately and block future sends for that combination.
Consent and suppression via API
Consent is managed through the dedicated Consent API — not viaPATCH /v1/contacts/{id}. Use POST /v1/contacts/{id}/consent to grant consent and optionally trigger a DOI confirmation:
DELETE /v1/contacts/{id}/consent/{record_id}. The record is preserved for audit — status becomes REVOKED and revoked_at is stamped.
Suppression reasons — HARD_BOUNCE, COMPLAINT, MANUAL_UNSUBSCRIBE — are written automatically by the platform when the corresponding event occurs and update the contact’s status field.
Segments and campaigns
Segments are stored filter definitions (saved queries) over contacts and their attributes. Campaigns use segments as audiences and advance executions per contact through each flow step. Segment size and estimated cost are shown before launch.Imports and integrations
Contacts can be created via:| Method | Availability |
|---|---|
| CSV import — field mapping and deduplication by email hash | available |
| Shopify — real-time webhook sync + initial bulk import | soon |
| Landing page submissions — platform creates or updates contacts after form submission | soon |
| Google Sheets — scheduled sync (hourly) | soon |
| HubSpot — real-time webhook sync | soon |
| Salesforce — Streaming API sync | soon |
| Generic REST API — configurable interval sync | soon |
Related
Landing pages
Lead capture, DOI, and consent into contacts.
Consent sync path
Import, capture, and keep consent current across channels.
Campaigns
Audiences, segments, and per-contact execution.
Events & analytics
Engagement events tied to contacts.