On a schedule
Get warned before Stripe free trials end
Each morning, an email lists every Stripe subscription whose trial ends in the next 3 days, with the customer, plan and whether a card is on file.
- Runs
- On a schedule
- Apps
- Stripe
- AI
- Not needed
- Access
- API key (restricted key with Subscriptions + Customers read)
Send this to your assistant
Create a ClickRuntime automation: every morning at 8, email me the Stripe subscriptions whose free trial ends in the next 3 days, with the customer's email, the plan and whether they have a card saved.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
Free trials on Stripe end quietly. The subscription moves to active or to incomplete, and nobody on the team notices which way it went until the monthly numbers come in. By then the person who never added a card has moved on.
This automation reads your Stripe trials every morning and emails you the ones ending in the next three days. Trials with no saved card come first, because those are the ones that will not convert without a nudge.
It reads subscriptions only and changes nothing in Stripe, so it is safe to run alongside your existing billing setup.
What you get out of it
Time to act
Three days is enough to send a reminder, book a call or extend a trial for a promising account.
Focus on the right people
Trials without a card are listed separately, so you know who needs a personal message.
One email a day
Everything ending soon arrives together, not as separate alerts.
Read only
It only lists subscriptions; nothing in Stripe is changed.
Works with any plan setup
Plan names come from your price nicknames, falling back to the price id.
How it works
What happens, step by step
Every morning, ClickRuntime asks Stripe for subscriptions that are still in a trial.
It keeps the ones whose trial ends within the next 3 days.
For each, it notes the customer's email, the plan and whether a payment method is saved.
You get one email, with trials that have no card listed first.
Before it runs live
- Connect Stripe
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
- 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 Stripe steps into one automation
Under the hood
The code that runs this automation
import time
import stripe
from datetime import datetime, timezone
from clickruntime import on_trigger, credentials, notify, report_fetched
DAYS = 3
@on_trigger
def run(event):
stripe.api_key = credentials.secret("STRIPE_API_KEY")
cutoff = time.time() + DAYS * 86400
ending = []
for sub in stripe.Subscription.list(status="trialing", limit=100,
expand=["data.customer", "data.default_payment_method"]).auto_paging_iter():
if sub.trial_end and sub.trial_end <= cutoff:
ending.append(sub)
report_fetched(len(ending))
if not ending:
return {"ending": 0}
def line(s):
plan = s["items"]["data"][0]["price"].get("nickname") or s["items"]["data"][0]["price"]["id"]
day = datetime.fromtimestamp(s.trial_end, timezone.utc).strftime("%a %d %b")
return f"- {s.customer.email} · {plan} · ends {day}"
has_card = lambda s: bool(s.default_payment_method or s.customer.invoice_settings.default_payment_method)
no_card = [line(s) for s in ending if not has_card(s)]
card = [line(s) for s in ending if has_card(s)]
body = "No card on file:\n" + ("\n".join(no_card) or "- none") + "\n\nCard saved:\n" + ("\n".join(card) or "- none")
notify.email_me(f"{len(ending)} Stripe trials end in the next {DAYS} days", body)
return {"ending": len(ending)}FAQ
Common questions
Why does it split trials by whether a card is saved?
Can I change the 3-day window?
Does it include trials started without a subscription, like Checkout trials?
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
Get yesterday's revenue every morning
Each morning you see yesterday's charges, refunds and new subscriptions in one message.
See how it worksGet a monthly revenue report
On the 1st you get last month's gross, refunds, net and new vs cancelled subscriptions, compared with the month before.
See how it worksSee overdue invoices every week
Each Monday you get open invoices past their due date, oldest first.
See how it worksKeep exploring
Set up “Get warned before Stripe free trials end” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.