Compliance & Contacts

Clean contacts in. No compliance surprises out.

CSV import with row-level validation, permanent opt-out protection, and cohort tracking. Bad rows are reported with reasons — the rest are imported and ready to message.

Row-level errorsevery failed row reported with the specific reason
0 opt-out overridesopted-out contacts cannot be reimported without operator action
Encrypted at restall PII stored as Fernet ciphertext — HMAC hash for indexed lookup
Cohort trackingevery import batch tracked — not started, in progress, complete
How import works

Every row validated before it enters the campaign.

CSV import validates each row individually and reports failures with specific reasons. Successfully imported contacts are encrypted, hashed for lookup, and immediately available for campaign launch. The import never silently drops a row.

  • Required fields validated per row — missing fields reported individually
  • Phone number deduplicated within the campaign — existing record preserved
  • Opted-out contacts skipped and counted in the import summary
  • Opt-out status and timestamp preserved — not overwritten by reimport
  • PII encrypted with Fernet symmetric encryption on write
  • HMAC-SHA256 hash stored for indexed lookup — no decryption required to find a contact
Import pipeline
  1. 1
    CSV uploaded
    Row count and preview shown before confirming
  2. 2
    Opt-out check
    Phone hash matched against opted_out flags — skipped if found
  3. 3
    Deduplication
    Duplicate phone within campaign rejected and reported
  4. 4
    Field validation
    Required fields checked — failures reported per row
  5. 5
    Encrypt and write
    PII encrypted, hash computed, contact created
  6. 6
    Cohort assigned
    Import batch tracked as named cohort with status
Cohort management

Track every group from import to completion.

Every import batch creates a named cohort. Cohort status updates automatically as conversations progress — giving you a live view of which groups have been messaged and which haven't started yet.

Cohort status tracking

Cohorts move through three states automatically: Not Started (before campaign launch), In Progress (conversations active), and Complete (all conversations closed).

How it works: Navigate directly from a cohort to the conversations it contains — no manual filtering required.

Permanent opt-out protection

Opted-out contacts are checked at import time using a phone hash lookup. Their status and timestamp are preserved — no reimport can overwrite an opt-out without explicit operator action.

How it works: Campaign launch is blocked automatically if opted-out contacts remain in a cohort.

Import summary

Every import produces a summary: total rows processed, successfully imported, skipped (opted-out), and rejected (validation failures) — each with reasons. No silent failures.

How it works: Summary is delivered as an in-platform notification when the import job completes.

Multi-campaign contacts

A contact can participate in multiple campaigns for the same client. Each campaign maintains its own independent conversation record — participation in one does not affect another.

How it works: Contact identity is consistent across campaigns — opt-out in one campaign applies everywhere.

Want to see how contact import
works end to end?

We'll walk through a CSV upload, show you the validation output, and launch a test campaign.