Weekly
Get a weekly list of users who went quiet
A Monday email listing users who haven't been seen in a month, each with a drafted win-back message you can send yourself.
- Runs
- Weekly
- Apps
- Supabase
- AI
- Optional
- Access
- read
Send this to your assistant
Create a ClickRuntime automation: every Monday, email me users from my Supabase profiles table whose last_seen is more than 30 days ago, skip anyone already listed, and include a short re-engagement email draft.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
A product with a few thousand accounts has a quiet churn problem: people sign up, use it a few times and drift away without cancelling anything. The last_seen date in Supabase shows it, but nobody queries it. By the time someone notices, those users have forgotten the product and a win-back email feels like spam.
Every week, ClickRuntime queries your users table by last activity, skips anyone it listed before so the same names do not repeat, and optionally asks ClickRuntime's built-in AI to draft a short win-back message tailored to what each person did. It then emails you the list with those drafts, ready to review and send.
It fits SaaS founders, community managers and customer success teams that want to reach lapsing users while a personal note can still work.
What you get out of it
Lapsing users get reached in time
A note two weeks after someone goes quiet often brings them back. Waiting until they have been gone for six months makes the same message ineffective, and a weekly list keeps the window open.
Nobody is nagged twice
Because users already listed are tracked in state, each person appears once. That avoids sending repeated emails to the same inactive account, which protects your sender reputation and goodwill. One name never appears twice.
Drafts save writing time
A suggested message that mentions their plan or last action gives you a starting point to edit rather than a blank page. Reviewing ten drafts is much quicker than composing ten emails.
You learn who stopped using which feature
The list shows last activity and any usage details you store. Patterns, such as people leaving after the first week, point to onboarding problems you can fix for everyone. Fixing that helps new users too.
Revenue at risk becomes visible
If paying customers appear on the list, you know before the renewal date that they have disengaged. Reaching out early can save the account, while a cancelled subscription is much harder to reverse.
How it works
What happens, step by step
Every Monday ClickRuntime looks in your database for users who haven't been active in a month.
It skips users it has already listed in an earlier week.
AI drafts a short win-back message for each one.
You get one email with each user, when they were last seen and their draft, ready for you to send yourself.
Before it runs live
- Connect Supabase
What you get
Build your own
Need it to work differently?
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
- Change what the AI looks for, or how it writes the result
- Add another app, for example also send it to Slack
- Combine it with other Supabase steps into one automation
Under the hood
The code that runs this automation
from datetime import datetime, timedelta, timezone
from clickruntime import on_trigger, credentials, http, notify, state, ai
SUPABASE_URL = "https://your-project.supabase.co"
def sb_headers(**extra):
key = credentials.secret("SUPABASE_SECRET_KEY")
return {"apikey": key, "Authorization": f"Bearer {key}", **extra}
@on_trigger
def run(event):
cutoff = (datetime.now(timezone.utc) - timedelta(days=30)).isoformat()
users = http.get(f"{SUPABASE_URL}/rest/v1/profiles", params={"select": "id,email,last_seen", "last_seen": f"lt.{cutoff}",
"order": "last_seen.asc"}, headers=sb_headers()).json()
listed = set(state.get("listed") or [])
new = [u for u in users if u["id"] not in listed]
if not new:
return {"new": 0}
try:
draft = ai.generate("Write a short, friendly re-engagement email for users who haven't logged in for a month.",
max_output_tokens=250).text
except (ai.AINotIncluded, ai.AILimitReached):
draft = "(AI draft unavailable this week)"
lines = [f"{u['email']} (last seen {u['last_seen'][:10]})" for u in new]
notify.email_me(f"{len(new)} inactive users", "\n".join(lines) + "\n\nDraft email:\n" + draft)
state.set("listed", list(listed | {u["id"] for u in new}))
return {"new": len(new)}FAQ
Common questions
How is inactive defined?
Is the AI draft required?
Does it send emails to the inactive users directly?
What permissions does it need?
Does it need AI?
How many runs does it use?
Can I change how it works?
Related
You might also like
Fill a Supabase table from feeds on a schedule
New articles, prices or other public items land in your table every hour, with duplicates skipped.
See how it worksLog outages in Supabase and get a diagnosis
When a site you watch fails, an incident row is written and you get an email with a short explanation of the likely cause.
See how it worksStop a free Supabase project from pausing
Your free project stays active, and you hear about it if the keep-alive query fails.
See how it worksKeep exploring
Set up “Get a weekly list of users who went quiet” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.