You do not need to complete every step before sending. Start with Step 1 (understand the model) and Step 2 (import existing consent) — these unblock your first send. Steps 3–5 build toward continuous, automated compliance.
Understand the consent model
Before importing or syncing anything, understand how consent is stored and enforced. The full consent model — field reference, DOI lifecycle, example payloads, and enforcement rules — is documented in Contacts — Consent model. Here’s the summary you need for this guide:
- Consent is structured, not a boolean flag. Each contact holds a
consent_records[]array — one entry perchannel_type+message_typecombination (EMAIL/RCS/SMS×MESSAGE/NEWSLETTER). - Status values:
GRANTED(sends permitted),REVOKED(blocked),PENDING(DOI awaiting confirmation). - Enforcement: Sends without a
GRANTEDrecord for the matching combination return422. Opt-out events set the record toREVOKEDimmediately. - DOI: When
enforced_doi: true, status staysPENDINGuntil the contact confirms via thedoi_channel. Only then does it advance toGRANTED.
Import existing consent from your list
If you’re migrating from another platform or ESP, your current opt-in list is the starting point. The import must carry consent evidence — not just a list of addresses.What to prepare in your CSV:
Import flow:
| Column | Notes |
|---|---|
email | Primary deduplication key |
phone | international format (e.g. +4930123456) for RCS/SMS |
first_name, last_name | Contact identity |
email_newsletter_consent | true / false |
rcs_newsletter_consent | true / false (if applicable) |
consent_date | ISO 8601 — used as granted_at |
consent_source | Free text — stored as source in the record |
- Go to Contacts → Import and upload the CSV.
- Map each column to the corresponding contact or consent field.
- Apply a tag (e.g.
migrated-2026-q1) so you can segment and audit this batch. - Contacts without a
consent_datewill havegranted_atset to the import timestamp — note this in your records.
Only import contacts for whom you hold a valid prior opt-in record under GDPR, CAN-SPAM, or the applicable regulation in your market. The platform stores what you provide — it cannot validate the legality of consent collected before import.
Capture new consent with landing pages (coming soon)
Platform landing pages are coming soon. The flow below describes the planned behaviour. For now, capture opt-ins on your own forms and write consent via the API sync approach in Step 4.
- Build the page — add a form block with name, email, phone, and a consent checkbox with explicit opt-in language.
- Enable double opt-in (DOI) — the platform creates a consent record with
status: PENDING,enforced_doi: true, anddoi_status: DOI_SEND, then dispatches a confirmation email. - Contact confirms — when the contact clicks the confirmation link, the platform updates
statustoGRANTEDanddoi_statustoDOI_ACCEPTED.granted_atis stamped at this moment. - Consent records will include
proof_textwith the landing page URL, anip_hash, and the full DOI audit trail.
Keep consent in sync with your integrations
As your contact base grows, consent changes happen in Shopify, your unsubscribe flow, and your forms — all of which need to stay in sync with the platform.
- Shopify (coming soon)
- API sync (available now)
- Webhooks write-back
Shopify integration is on the roadmap. When available, it will connect via OAuth under Contacts → Integrations and sync marketing email consent in real time via Shopify webhooks, including write-back for unsubscribes. Until then, use the API sync approach below.
Manage opt-outs and suppression
Opt-outs happen continuously. The platform handles the mechanics automatically — your job is to ensure nothing re-imports suppressed contacts.What happens automatically:
- Email unsubscribe (one-click or link):
email.unsubscribedevent emitted; consent record updated;MANUAL_UNSUBSCRIBEsuppression applied - Hard email bounce:
email.bouncedwithbounce_type: hard;HARD_BOUNCEsuppression applied; no future sends - Email complaint:
email.complainedevent emitted;COMPLAINTsuppression applied - RCS
STOPreply: RCS newsletter consent revoked - SMS
STOP: SMS consent revoked
- Prevent re-import: Before any CSV import, look up the contact via
GET /v1/contacts/{id}and check theirstatusfield — contacts withBOUNCEDorBLOCKEDstatus are skipped by the import tool automatically. - Integration write-back: Handle the
email.unsubscribedwebhook to update your Shopify or CRM record — prevents suppressed contacts from being re-added on the next sync. - Audit regularly: Export the consent audit log from Contacts → Compliance to verify that consent records match your source of truth.
Suppression is channel and message type specific. A hard bounce on email subscription sends does not automatically suppress email action-based sends — action-based mail (receipts, alerts) may still be deliverable to the same address.
Webhooks
email.unsubscribed, email.bounced, and email.complained event payloads.Contacts
Full contact record shape and consent model.
Compliance checklist
Before your first newsletter send
Before your first newsletter send
Ongoing
Ongoing
- Shopify (or other integration) sync uses
POST /v1/contacts/{id}/consentfor opt-in andDELETEfor opt-out — not a bulk PATCH - Webhook handler for
email.unsubscribedcallsDELETE /v1/contacts/{id}/consent/{record_id}and writes back to your data source - CSV imports use the dashboard import tool (it checks suppression state and skips blocked contacts automatically)
- Consent audit log (
GET /v1/contacts/{id}/consent) is reviewed at least monthly - RCS
STOPreplies are handled (automatic — verifydoi_statusandrevoked_atin contact consent records)
Related
Landing pages
Opt-in forms, DOI, and consent capture at scale.
Contacts
Contact structure, PII encryption, and consent model.
Webhooks
Unsubscribe, bounce, and complaint event payloads.
Email campaign path
Put consent to work in your first email newsletter.