Skip to content

Monthly

Clean out subscribers who stopped opening

Once a month you get the people with no opens in six months, and they are archived only after you approve.

Runs
Monthly
Apps
Mailchimp
AI
Not needed
Access
read+write

Send this to your assistant

Create a ClickRuntime automation: on the 1st of every month, find Mailchimp subscribers with no opens in 180 days, email me the list, and archive them after I reply yes.

Paste it into your assistant. It tells you what it will send or change before it runs live.

First time? Adding ClickRuntime to your assistant takes about two minutes.

Why use it

Why teams use this automation

A list of 12,000 contacts can quietly contain 4,000 people who stopped opening anything a year ago. They still count toward your Mailchimp bill, they drag down your open rate, and mailbox providers read a steady stream of ignored email as a sign you may be sending something unwanted. That hurts delivery for the readers who do care.

Once a month, this finds members whose engagement is low, based on their `member_rating` and last open, and emails you the list. Nothing is removed on its own. When you approve, the contacts are archived, or tagged "inactive" if you would rather keep them reachable for a final win-back campaign.

It is most useful for ecommerce stores and newsletters that have grown through giveaways or imports, where the list is full of people who signed up once and never engaged.

What you get out of it

  • Lower bill without losing real readers

    Mailchimp prices by audience size, so archiving contacts who never open means you stop paying to email them. Because you review the list first, a customer who reads but never clicks is not removed by mistake.

  • Better inbox placement for everyone else

    Sending to people who ignore you for months signals low engagement to mailbox providers. Trimming those contacts keeps your sender reputation healthy, so mail reaches the inbox of subscribers who still want it.

  • Honest numbers in every report

    An open rate computed over a clean list reflects real interest. When you report to a manager or client, the figure is not diluted by thousands of dormant addresses that were never going to respond.

  • A gentler option than deleting

    Tagging as inactive keeps the address available. You can run one last re-engagement campaign to that tag, and only archive those who still stay silent, which recovers some readers you would have lost.

  • Cleanup that actually happens

    List hygiene is the chore everyone plans and nobody schedules. A monthly run keeps the audience from drifting back to thousands of dead contacts between the yearly cleanups that tend to be skipped.

How it works

What happens, step by step

  1. Once a month, ClickRuntime finds Mailchimp subscribers who have not opened an email in a long time.

  2. You get an email with the count and the list of addresses.

  3. Once you approve, those subscribers are archived or tagged inactive, so you stop paying for and sending to people who never read.

Before it runs live

  • Connect Mailchimp

What you get

RunsMonthly
Clean out subscribers who stopped openingtoday, 9:00Succeeded
Email · Inactive subscribers83 subscribers with no opens in 180 days old-list@acme.example · info@northwind.example ...

Build your own

Need it to work differently?

This template is a starting point. Copy the prompt and change it, or describe a different automation from scratch, with your own conditions, more apps or an AI step. Your assistant writes it, tests it and runs it on ClickRuntime.
  • Your own rules

    Conditions, thresholds, filters and exceptions, written the way you'd explain them to a colleague.

  • Any number of apps

    One automation can read from one app and update several others. Over 248 apps are ready, and anything with an API works too.

  • AI where it helps

    Summaries, classification, extraction and drafts use ClickRuntime's built-in AI, with no extra key.

  • On a schedule or on each event

    Runs as often as every 5 minutes, or the moment an app sends an event, and keeps track of what it already handled.

Changes you can ask for

  • Run it at a different time, more or less often, or only on weekdays
  • Add an AI step, for example to summarize, sort or draft a reply
  • Add another app, for example also send it to Slack
  • Combine it with other Mailchimp steps into one automation

Under the hood

The code that runs this automation

This is the Python script that runs each time the automation starts. Your AI assistant writes it for you when you send the prompt, and you allow each step in your assistant. To change how the automation works, describe the change to your assistant and it updates the script for you. For every function it can use, see the script reference.
clean_up_inactive_subscribers.pyexample
import hashlib
from datetime import datetime, timedelta, timezone
from clickruntime import on_event, on_trigger, http, credentials, notify, state

LIST_ID = "AUDIENCE_ID"

def mailchimp(method, path, **kw):
    key = credentials.secret("MAILCHIMP_API_KEY")
    r = http.request(method, f"https://{key.split('-')[-1]}.api.mailchimp.com/3.0{path}", auth=("clickruntime", key), **kw)
    r.raise_for_status()
    return r.json() if r.content else None

@on_trigger
def find_inactive(event):
    cutoff = (datetime.now(timezone.utc) - timedelta(days=180)).isoformat()
    members = mailchimp("GET", f"/lists/{LIST_ID}/members", params={"status": "subscribed", "count": 1000,
                        "fields": "members.email_address,members.last_changed,members.stats"})["members"]
    inactive = [m["email_address"] for m in members if m["last_changed"] < cutoff and m["stats"]["avg_open_rate"] == 0]
    state.set("pending", inactive)
    notify.email_me(f"{len(inactive)} subscribers with no opens in 180 days",
                    "\n".join(inactive) + "\n\nReply yes in ClickRuntime (send {\"confirm\": \"yes\"} to the trigger link) to archive them.")
    return {"inactive": len(inactive)}

@on_event
def confirm(event):
    if (event.json or {}).get("confirm") != "yes":
        return {"archived": 0}
    pending = state.get("pending") or []
    for email in pending:
        mailchimp("DELETE", f"/lists/{LIST_ID}/members/{hashlib.md5(email.lower().encode()).hexdigest()}")
    state.delete("pending")
    return {"archived": len(pending)}

FAQ

Common questions

What counts as an inactive subscriber here?
It looks at Mailchimp's engagement signals, namely the contact's `member_rating` and the date of their last open. Members with a low rating and no recent opens are listed. Brand new subscribers are not penalized for not having had time to engage yet.
Does archiving a contact delete them permanently?
No. In Mailchimp an archived contact is removed from your active audience count but its history is kept, and the person can resubscribe later. That is why it works as a cautious step before any permanent removal you decide on yourself.
Can I use a different cutoff than six months?
Yes. The six-month window is a setting, so you can tighten it to three months for a fast-moving promotional list or loosen it to a year for a quarterly newsletter. Tell your AI assistant the window you want and approve the change.
What permissions does it need?
read+write. Nothing else in your accounts is used.
Does it need AI?
No. It runs without AI, so it doesn't use your plan's AI allowance.
How many runs does it use?
One run each time it runs (monthly). Checks that find nothing to do and stop right away aren't counted.
Can I change how it works?
Yes. Describe the change to your AI assistant, for example a different schedule, channel or filter. It updates the automation, tests it and tells you what changed.

Set up “Clean out subscribers who stopped opening” from your assistant

Copy the prompt above, or connect your assistant first. Free plan, no credit card.