Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/DataTalksClub/datamailer/llms.txt

Use this file to discover all available pages before exploring further.

The contact explorer gives operators a detailed view of every contact in the system — their global suppression state, per-audience subscriptions, email validation status, tag memberships, and a full engagement history. Operators can also make manual adjustments to verification, suppression, subscription status, and tags directly from the UI.

Searching for Contacts

The contact search page at /contacts/ supports filtering contacts by a range of criteria. Enter any of the following parameters to narrow results:
FilterDescription
qEmail address partial match (case-insensitive).
audienceFilter to contacts subscribed to a specific audience.
clientFilter to contacts subscribed via a specific client.
include_tags / exclude_tagsTag slug filters scoped to the selected audience.
subscription_statuspending, subscribed, or unsubscribed.
verifiedverified or unverified.
email_validation_statusAny of the validation status values (see below).
suppressionglobal_unsubscribed, hard_bounced, or complained.
campaign_statusFilter by a contact’s most recent campaign recipient status.
skip_reasonFilter by last campaign skip reason.
engagementnot_opened, not_clicked, opened_not_clicked, never_opened, never_clicked, or inactive_since.
Results are not shown until at least one filter is applied. The results table includes verification badge, validation badge, subscription summary, tag summary, last sent, last opened, and last clicked timestamps, and a recent issue indicator.

Contact Detail

The contact detail page at /contacts/{email}/ provides a full view of a single contact identified by their normalised (lowercased) email address. The page is divided into several sections:
  • Eligibility summary — per-subscription-scope breakdown of whether marketing and transactional email can be sent, with the specific reasons listed if sending is blocked.
  • Global state — verification badge, email validation badge, and suppression badge (globally unsubscribed, hard bounced, or complained).
  • Sendability — a consolidated marketing/transactional can-send indicator across all subscription scopes.
  • Subscriptions — every audience/client subscription with its status, verified state, and unsubscribe reason.
  • Tags — all audience-scoped tag memberships.
  • Metrics — last sent, last opened, last clicked, last bounce, last complaint, and last unsubscribe timestamps.
  • Campaign history — paginated list of all campaign recipient records with send status, skip reason, and campaign details.
  • Transactional history — paginated list of all transactional messages sent to this contact.
  • Event timeline — chronological stream of all email events (open, click, bounce, complaint, unsubscribe, etc.).
  • Audit log — recent operator actions recorded against this contact.
The event timeline combines campaign recipient events, transactional message events, and raw email events (e.g. SES webhook events) into a single chronological view. Each event shows its type, context (which campaign or template it relates to), and any available metadata such as bounce reason or click URL.

Updating Contact State

POST to /contacts/{email}/state/ (the Update state form on the contact detail page) to manually set the contact’s global fields:
FieldOptionsEffect
verified_stateverified / unverifiedSets or clears verified_at. Required for marketing sends.
email_validation_statusSee validation statuses belowUpdates the validation status and clears/sets email_validated_at.
email_validation_reasonFree textHuman-readable reason stored alongside the validation status.
global_unsubscribedBoolean checkboxSets or clears global_unsubscribed_at. Blocks all marketing sends.
hard_bouncedBoolean checkboxSets or clears hard_bounced_at. Blocks marketing and transactional sends.
complainedBoolean checkboxSets or clears complained_at. Blocks marketing and transactional sends.
All state changes are recorded in the operator audit log with the actor’s username.

Email Validation Status Values

The email_validation_status field captures the deliverability assessment of a contact’s email address:
ValueMeaning
unknownNo validation has been performed. Default for new contacts.
validAddress passed validation checks.
invalid_syntaxAddress fails basic format validation.
no_mxDomain has no MX record — email cannot be delivered.
disposableAddress belongs to a known disposable email provider.
riskyAddress is syntactically valid but considered high-risk (e.g. catch-all domain).
manually_invalidAn operator has manually marked the address as invalid.
externally_validatedAddress was validated by an external system (e.g. Mailchimp import for subscribed contacts).
Contacts with invalid_syntax, no_mx, disposable, or manually_invalid statuses are skipped in campaign sends with a skip reason of invalid_email.

Suppression Fields and Sending Eligibility

Three global suppression flags block future sends regardless of subscription status:
FieldEffect on marketingEffect on transactional
global_unsubscribed_atBlocked — skip reason global_unsubscribeAllowed
hard_bounced_atBlocked — skip reason hard_bounceBlocked
complained_atBlocked — skip reason complaintBlocked
Additionally, verified_at must be set for a contact to be eligible for marketing sends. Unverified contacts are skipped with reason unverified.

Managing Subscriptions

POST to /contacts/{email}/subscriptions/ (the Update subscription form) to manually adjust a subscription:
FieldDescription
audienceThe audience this subscription belongs to.
clientOptional client (leave blank for audience-wide subscriptions).
statuspending, subscribed, or unsubscribed.
unsubscribe_reasonRequired when setting status to unsubscribed.
verifiedWhether the subscription should be marked as verified.
If no subscription exists for the given audience/client combination, one is created.

Managing Tags

Add a tag by POSTing to /contacts/{email}/tags/add/. You can either select an existing tag from the audience or supply a new tag name and slug to create one on the fly. If the tag slug already exists in the audience, the existing tag is used rather than creating a duplicate. Remove a tag by POSTing to /contacts/{email}/tags/remove/ with the tag membership to remove. Only tags currently held by this contact are selectable in the remove form. Both add and remove actions are logged in the operator audit log with the audience slug and tag slug.

Build docs developers (and LLMs) love