Consent is per contact, per channel, per message type. A contact can have newsletter consent for email, no consent for RCS newsletter, and full consent for SMS — all independently. This guide walks through setting up a compliant, auditable consent flow from first opt-in to ongoing sync.
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.
1

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 per channel_type + message_type combination (EMAIL/RCS/SMS × MESSAGE/NEWSLETTER).
  • Status values: GRANTED (sends permitted), REVOKED (blocked), PENDING (DOI awaiting confirmation).
  • Enforcement: Sends without a GRANTED record for the matching combination return 422. Opt-out events set the record to REVOKED immediately.
  • DOI: When enforced_doi: true, status stays PENDING until the contact confirms via the doi_channel. Only then does it advance to GRANTED.
Action-based (MESSAGE) sends do not require subscription consent — they’re for receipts, alerts, and verification flows. NEWSLETTER sends always require an explicit GRANTED consent record. Do not use MESSAGE to bypass consent requirements for promotional content.
2

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:
ColumnNotes
emailPrimary deduplication key
phoneinternational format (e.g. +4930123456) for RCS/SMS
first_name, last_nameContact identity
email_newsletter_consenttrue / false
rcs_newsletter_consenttrue / false (if applicable)
consent_dateISO 8601 — used as granted_at
consent_sourceFree text — stored as source in the record
Import flow:
  1. Go to Contacts → Import and upload the CSV.
  2. Map each column to the corresponding contact or consent field.
  3. Apply a tag (e.g. migrated-2026-q1) so you can segment and audit this batch.
  4. Contacts without a consent_date will have granted_at set 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.
3

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.
When landing pages launch, net-new opt-ins will work like this:
  1. Build the page — add a form block with name, email, phone, and a consent checkbox with explicit opt-in language.
  2. Enable double opt-in (DOI) — the platform creates a consent record with status: PENDING, enforced_doi: true, and doi_status: DOI_SEND, then dispatches a confirmation email.
  3. Contact confirms — when the contact clicks the confirmation link, the platform updates status to GRANTED and doi_status to DOI_ACCEPTED. granted_at is stamped at this moment.
  4. Consent records will include proof_text with the landing page URL, an ip_hash, and the full DOI audit trail.
4

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 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.
5

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.unsubscribed event emitted; consent record updated; MANUAL_UNSUBSCRIBE suppression applied
  • Hard email bounce: email.bounced with bounce_type: hard; HARD_BOUNCE suppression applied; no future sends
  • Email complaint: email.complained event emitted; COMPLAINT suppression applied
  • RCS STOP reply: RCS newsletter consent revoked
  • SMS STOP: SMS consent revoked
What you need to manage:
  1. Prevent re-import: Before any CSV import, look up the contact via GET /v1/contacts/{id} and check their status field — contacts with BOUNCED or BLOCKED status are skipped by the import tool automatically.
  2. Integration write-back: Handle the email.unsubscribed webhook to update your Shopify or CRM record — prevents suppressed contacts from being re-added on the next sync.
  3. 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

  • All contacts have a consent_records[] entry with status: GRANTED, source, and proof_text for the target channel_type + message_type
  • For DOI flows: doi_status: DOI_ACCEPTED is present — PENDING contacts will not receive sends
  • Domain authentication is complete (SPF, DKIM, DMARC)
  • Unsubscribe footer is in your email template (auto-added via brand kit or manually)
  • One-click unsubscribe header is enabled on your email channel
  • Landing page forms have enforced_doi: true and a doi_channel configured
  • Shopify (or other integration) sync uses POST /v1/contacts/{id}/consent for opt-in and DELETE for opt-out — not a bulk PATCH
  • Webhook handler for email.unsubscribed calls DELETE /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 STOP replies are handled (automatic — verify doi_status and revoked_at in contact consent records)

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.