Automatic list cleanup

Unsubscribe people who have not opened or clicked for 30, 90, or 180 days. Off by default. Preview before you enable.

Automatic list cleanup removes inactive subscribers so the list stays healthy. It is off until an owner or admin calculates a preview and turns the switch on from that receipt.

Do not invent a custom inactivity unsubscribe with the API. Use this setting.

Watch the complete walkthrough

This three-minute walkthrough shows the complete journey: the eligibility rules, preview before enable, analytics after cleanup, the re-engagement email, a cleaned subscriber, and the recovery page.

If the player does not load, watch the automatic list cleanup walkthrough on Tella.

What it does

With Automatic list cleanup on, Lumail regularly scans SUBSCRIBED contacts and unsubscribes anyone who:

  • has not opened or clicked a marketing email in the interval you chose (30, 90, or 180 days)
  • has not come back through a cleanup recovery link in that same interval
  • has been subscribed for at least 7 days
  • has at least 5 delivered marketing emails
  • has a trustworthy subscription history
  • belongs to an organization whose tracking coverage has been intact for the full interval

Everyone else is kept or deferred. Preview never changes a contact. Enabling only turns the setting on — the next scan applies it.

Settings → Configuration → Automatic list cleanup
        ↓
Preview (dry run + 10-minute receipt)
        ↓
Turn the switch on
        ↓
Daily scan (pages of 100)
        ↓
UNSUBSCRIBED  +  optional re-engagement email
        ↓
Click {{subscribeUrl}}  →  /resubscribe?token=…
        ↓
SUBSCRIBED again  (or confirmation email if double opt-in is on)

Enable it

  1. Open Settings → Configuration → Automatic list cleanup. The URL is /orgs/[your-org]/settings/configuration/automatic-cleanup.
  2. Pick Remove after (30, 90, or 180 days).
  3. Leave Send a re-engagement email on if you want one last email after they are removed.
  4. Click Preview. Nobody is unsubscribed.
  5. Wait until the card shows how many would be removed (or Nobody matches.).
  6. Turn the switch on, or click Turn on cleanup. The receipt expires after 10 minutes — preview again if it does.
  7. Click Save only if you changed the interval or re-engagement toggle without enabling.

Automatic list cleanup card on Settings → Configuration

Preview on the left, Save on the right. The switch stays locked until a completed preview exists.

ControlWhat it does
Automatic list cleanupOff until a completed preview receipt exists. On starts scans. Off disables immediately — no preview needed
Remove afterInactivity window: 30, 90, or 180 days. Default 90
Send a re-engagement emailAfter unsubscribe, send one transactional email with {{subscribeUrl}}. Default on
Edit emailOpens the re-engagement editor (only when the re-engagement switch is on)
PreviewSaves the interval + re-engagement toggle, then counts who would be removed. Does not enable
SavePersists interval and re-engagement. Cannot turn the feature on

Turning the main switch on without a completed preview shows Preview first. Changing the interval or re-engagement toggle after a preview invalidates the receipt — preview again.

When the preview finishes, the card shows Nobody matches. or N of M contacts would be unsubscribed. plus sample addresses. Enabling still requires that completed receipt, even if the count is zero.

Who is never removed

Keep / deferWhy
Open or click in the intervalRecent activity
Came back via /resubscribe in the intervalRecent recovery
Subscribed less than 7 days agoNew subscription
Fewer than 5 delivered marketing emailsNot enough sends to judge inactivity
Subscription history unknownMissing or untrustworthy SUBSCRIBED event
Tracking coverage unprovenOpens/clicks have not been recorded for the full window

A brand-new organization cannot auto-remove anyone until one full selected interval after tracking coverage starts. Existing organizations inherit coverage from the organization creation date. If tracking drops (abandoned batch, DLQ, force-ack, email purge), the coverage clock resets and cleanup defers again until a full interval of intact tracking.

Transactional, pending, already unsubscribed, and bounced contacts are outside the candidate set.

Analytics after you enable

Once the switch is on, the same page shows cleanup analytics for the last 7 / 30 / 90 days:

KPIMeaning
CleanedInactive subscribers unsubscribed automatically
RecoveredShare of cleaned subscribers who came back through the recovery link
Re-engagement emailsRecovery emails sent to cleaned subscribers
Next scanWhen the next full pass is scheduled, plus the last cleanup time

Below the KPIs: a Cleaned subscribers chart (unsubscribed vs recovered) and a Recent cleanups table (per day: cleaned, emailed, recovered).

Empty states tell you why nothing happened:

  • tracking coverage is still shorter than the inactivity window
  • a scan is paging the list (100 contacts at a time) and nobody has been unsubscribed yet
  • the last full scan found nobody to remove
  • the first scan is still being scheduled

Cleaned contacts appear here only after someone is actually unsubscribed — not when the preview finishes.

Re-engagement email

Optional. Default subject is Are you still interested?. Default preview is Stay on the list or we'll stop sending.

Unsubscribe is applied first. The email is sent afterwards on the confirmation/transactional path — not as a campaign. If sending fails or is skipped, they stay UNSUBSCRIBED. Lumail logs the failure.

The template must include a real button or link with {{subscribeUrl}}. Type @ and pick Re-subscribe URL, or put {{subscribeUrl}} on a button URL. Missing it refuses the save.

Re-engagement email editor with subject, preview, and Stay subscribed button

Subject, preview, and body. The button must point at {{subscribeUrl}}.

Data pointDetail
Subject / PreviewInbox subject and preview text
{{subscribeUrl}}Required. Opens /resubscribe?token= (24-hour single-use token)
{{unsubscribeUrl}}Optional. Default footer includes it
{{name}} / fieldsSame subscriber variables as campaigns. @ opens the menu
SnippetsType / to insert an organization snippet
Default senderAlways the organization's default sender
Save emailWrites the template. Missing {{subscribeUrl}} is rejected

On a cleaned contact, the timeline shows was unsubscribed by automatic list cleanup. Open View email on the re-engagement send to read the exact message they received.

Recovery page

The re-engagement link opens /resubscribe?token=….

  1. The page shows Stay subscribed? and a prefilled email field.
  2. They confirm the address and click Stay subscribed. A different email is rejected — the field exists so they can see and confirm the address, not change it.
  3. If they are already SUBSCRIBED, it says so and stops.
  4. If double opt-in is on, status becomes PENDING_CONFIRMATION and they get the confirmation email. Campaigns wait for that click.
  5. If double opt-in is off, they become SUBSCRIBED immediately. Unsubscribe guards are cleared. Workflows are not published from this recovery.

The token lasts 24 hours and is single-use. A second click on a used or expired link fails.

Timeline

Filter a subscriber timeline by Automatic list cleanup.

EventCopy
AUTOMATIC_LIST_CLEANUP (admitted)was queued for automatic list cleanup
AUTOMATIC_LIST_CLEANUP (finalized)was removed by automatic list cleanup
UNSUBSCRIBED (source: AUTOMATIC_LIST_CLEANUP)was unsubscribed by automatic list cleanup
SUBSCRIBED (source: AUTOMATIC_LIST_CLEANUP_RECOVERY)came back from automatic list cleanup

Unsubscribe reason stored on the contact is Automatic list cleanup.

After you enable

A full pass runs once a day. The scan pages 100 subscribed contacts per organization until the list is finished, then waits 24 hours.

Disable anytime with the switch. No preview required. Existing unsubscribes stay unsubscribed — disable does not restore them.

Do not enable from the raw configuration API. Ask Lumail can preview and enable only with a completed receipt (preview_list_cleanup then enable_list_cleanup). update_list_cleanup_settings can disable or change the interval; it cannot turn the feature on.