Skip to main content

Status Reasons

Possible values for reason field in subscription webhooks.

Unsubscribe reasons

ReasonDescription
unsubscribed_by_userUser clicked unsubscribe link in email
unsubscribed_by_adminAdmin unsubscribed in Mission Control
unsubscribed_via_apiUnsubscribed via Trace API
bounced_hardEmail address hard bounced
bounced_softEmail address soft bounced (multiple times)
complainedUser marked email as spam

Subscribe reasons

ReasonDescription
subscribed_via_formSubscribed through website form
subscribed_via_apiSubscribed via Trace API
subscribed_via_importSubscribed through data import
resubscribedPreviously unsubscribed, now resubscribed

Handling reasons

def handle_subscription_change(email, status, reason):
if reason == 'bounced_hard':
# Mark email as invalid in your system
mark_email_invalid(email)

elif reason == 'complained':
# User marked as spam - handle carefully
log_spam_complaint(email)

elif reason == 'unsubscribed_by_user':
# Normal unsubscribe
update_preferences(email, subscribed=False)

Best practices

  1. Hard bounces - Remove from mailing lists permanently
  2. Spam complaints - Investigate and improve email practices
  3. Soft bounces - May recover, keep monitoring
  4. User unsubscribes - Respect immediately