Skip to content

Subscription State Diagrams

This document describes the subscription lifecycle, including state transitions, emails/notifications sent, and views rendered.

Subscription Status States

Status Definitions

StatusDescriptionCan Receive Emails
UnconfirmedSigned up but hasn't clicked confirmation link (double opt-in pending)No
ActiveConfirmed email, receiving emailsYes
UnsubscribedOpted out via unsubscribe linkNo
BouncedEmail delivery failed permanently (invalid address, mailbox doesn't exist)No
JunkSubscriber marked emails as spamNo

Confirmation Flow

Legacy Controller: ConfirmSubscriptionController

Route: GET /newsletter/confirm (subscriptions.confirmDeprecated)

Signed Controller: ConfirmSubscriptionSignedController

Route: GET /subscriptions/{subscriber:token}/confirm/{list} (subscriptions.confirm)

Confirmation Emails Sent

NotificationWhen SentContact List
SubscriberConfirmedEmailAfter successful confirmationPowerfulWeeklyEmail only

Confirmation Views Rendered

ViewCondition
pages.subscription.emailConfirmed.free-ebookFREE_EBOOK_LIST or other lists
pages.subscription.emailConfirmed.free-ebook-with-newsletterPOWERFUL_WEEKLY_EMAIL_LIST
pages.subscription.errorInvalid link, not found, or cannot confirm

Unsubscribe Flow

Legacy Controller: UnsubscribeController

Route: GET /newsletter/unsubscribe (subscription.unsubscribeDeprecated)

Signed Controller: UnsubscribeSignedController

Route: GET /subscriptions/{subscriber:token}/unsubscribe/{list} (subscriptions.unsubscribe)

Unsubscribe Emails Sent

NotificationWhen SentCondition
SubscriberUnsubscribedAfter successful unsubscribeOnly if subscriber had previously confirmed their email (confirmed_at != null)

Unsubscribe Views Rendered

ViewData Passed
pages.subscription.unsubscribemessage, title, email, resubscribe link, highlight_courses, books

Complete Subscription Lifecycle


All Contact List Notifications

Notification ClassPurposeTrigger
ConfirmationNeededForDownloadingFreeEbookDouble opt-in for free ebookUser subscribes for free ebook
ConfirmationNeededForDownloadingFreeEbookWithWeeklyNewsletterSubscriptionDouble opt-in for ebook + newsletterUser subscribes for ebook and newsletter together
ConfirmationNeededForWeeklyNewsletterSubscriptionDouble opt-in for newsletterUser subscribes to weekly newsletter
ConfirmationStillNeededReminder for unconfirmed subscriptionScheduled job for pending confirmations
PromoteNewsletterForFreeEbookDownloaderUpsell newsletter to ebook downloaderAfter ebook download
SubscriberConfirmedEmailWelcome email after confirmationSuccessful confirmation (PowerfulWeeklyEmail list only)
SubscriberUnsubscribedGoodbye email after unsubscribeSuccessful unsubscribe (if was confirmed)

Error Codes

CodeEnum ValueMeaning
invalid-book-linkInvalidBookLinkBook download link is invalid
already-subscribed-confirmation-requiredConfirmationRequiredAlready subscribed but needs confirmation
cannot-confirmCannotConfirmCannot confirm subscription (unsubscribed, invalid link, or not found)

URL Patterns

Legacy URLs (with secrets in query params)

  • Confirm: /newsletter/confirm?email={email}&list_id={list}&check={secret}
  • Unsubscribe: /newsletter/unsubscribe?email={email}&list_id={list}&check={unsubscribe_secret}
  • Confirm: /subscriptions/{token}/confirm/{list}?signature={sig}&expires={ts}
  • Unsubscribe: /subscriptions/{token}/unsubscribe/{list}?signature={sig}&expires={ts}

Signed URLs are more secure as they:

  1. Don't expose secrets in query parameters
  2. Have built-in expiration
  3. Are tamper-proof (signature validation)