Someone reads the replies to your newsletter.
People answer your product updates. Your agent handles what comes back: questions get answers, and unsubscribes take effect, inside your suppression rules.
Replies land in a mailbox.
Send your updates to people who opted in, from a mailbox like updates@. When someone replies, the reply joins a thread with them there, and your agent reads it.
updates@yourco.com · each reply threads to its contact
One click unsubscribes.
Put the unsubscribe placeholder in your email, and each recipient gets their own signed link, plus the one-click header mail apps show. A click adds them to your suppressions.
{{molted:unsubscribe_url}} · RFC 8058 one-click List-Unsubscribe
Asking to be removed works too.
Some people reply "take me off this list" instead. Molted classifies that as an unsubscribe and adds the sender to your suppressions. When the classifier isn't sure, a person confirms first. After that, sends to them are blocked.
get_thread({ thread_id: "thr_61be" })→ messages[1] { direction: "inbound", subject: "Re: September update", intent: "unsubscribe", routingAction: "trigger_unsubscribe" }# Molted suppressed the sender when the reply arrived send_email({ to: "kim@example.org", template_id: "october-update", ... })→ { requestId: "req_0c3e", status: "blocked", reason: "suppressed" }Consent stays on record.
When someone opts in, your agent records where and how. Before it writes, it can check the record, and a withdrawal is recorded the same way.
check_consent({ recipient_email: "kim@example.org" })→ { hasConsent: true, basis: "explicit_opt_in", source: "signup_form", grantedAt: "2026-06-02T10:14:00.000Z" }Give your agent its own mailbox.
$ npx @molted/cli auth signup