Blog · · 5 min read
How to remind customers before their free trial ends with n8n and AI
Step-by-step guide so n8n checks your free trials in Google Sheets every morning, spots the ones ending soon and drafts a clear Gmail reminder with AI before access is cut.

A customer tries your academy, SaaS or service… and the day the trial ends they never got a clear heads-up. You lose the conversion and they think “it just stopped working” without a calm chance to decide.
In this guide you will build an n8n workflow that every morning checks a free-trial register in Google Sheets, finds trials ending in about 3 or 1 day and drafts a clear Gmail reminder with AI. You review the draft and send it.
This is not the same as a subscription renewal reminder: there the customer already pays and the plan renews; here they are still on a free trial (or a symbolic paid trial) and need to choose whether to continue. It also does not replace a failed recurring card reminder: that arrives when a charge has already bounced.
What you will build
A five-step workflow that runs on its own every day:
- Daily trigger: a Schedule Trigger node runs at 09:20.
- Read trials: a Google Sheets node reads your “Free trials” sheet.
- Filter by days left: a Code node keeps rows ending in ~3 or ~1 day that have not yet had that stage’s reminder.
- AI reminder: a Basic LLM Chain node writes a warm email that recalls the value tried, states the end date and offers the activation link.
- Draft and log: Gmail creates the draft and Google Sheets records the stage in
reminder_sent.
What you need
- An n8n instance (cloud or installed free on your computer).
- Google Sheets and Gmail connected in n8n.
- An OpenAI (or other AI) API key, with a monthly spend limit set in the provider’s dashboard.
- A “Free trials” sheet with these columns:
customer,email,product,ends_on(YYYY-MM-DD),usage_summary(optional),activate_link(optional),notesandreminder_sent(empty or1/2).
You can fill the sheet by hand when you start a trial, or with another n8n workflow that writes each signup. This guide assumes the rows are already in Sheets.
Step 1: prepare the free-trials sheet
Keep ends_on in a consistent date format and leave only active trials (archive converted or cancelled ones). In usage_summary note something useful if you have it (“3 classes booked”, “12 invoices imported”, “chatted with the agent 8 times”); otherwise leave it empty. In activate_link put the checkout, portal or “activate plan” URL; if you do not have a fixed one, leave it empty. In notes capture preferences (“prefers WhatsApp”, “asked for an extension”, “5-person company”).
Step 2: trigger and read
Add a daily Schedule Trigger at 09:20 (check the workflow timezone in Settings is Europe/Madrid or your local zone). Connect it to Google Sheets → Get Row(s) pointing at your “Free trials” sheet.
Step 3: filter trials about to end
Add a Code node (Run Once for All Items) with this code:
const today = new Date(); today.setHours(0, 0, 0, 0);
const out = [];
for (const i of $input.all()) {
const c = i.json;
if (!c.email || !c.ends_on) continue;
const end = new Date(c.ends_on); end.setHours(0, 0, 0, 0);
const days = Math.round((end - today) / 86400000);
if (days < 0 || days > 5) continue;
const already = Number(c.reminder_sent || 0);
let stage = null;
if (already < 1 && days <= 3 && days >= 2) stage = 1; // ~3 days
else if (already <= 1 && days <= 1) stage = 2; // today or tomorrow
if (!stage) continue;
out.push({ json: { ...c, days, stage } });
}
return out;
Each trial gets at most two reminders. If nothing is due, the workflow ends without spending AI credits.
Step 4: draft the reminder with AI
Add a Basic LLM Chain with a small cheap model (for example gpt-4o-mini) and this prompt:
You manage onboarding for [BUSINESS NAME]. Write a short email to
{{ $json.customer }} letting them know their free trial of “{{ $json.product }}”
ends on {{ $json.ends_on }} ({{ $json.days }} days left).
Usage summary (mention it if present; if empty, do not invent activity): {{ $json.usage_summary }}
Link to activate the plan (include it if present; if empty, do not invent one): {{ $json.activate_link }}
Notes: {{ $json.notes }}
- Warm, professional tone, max 7 sentences.
- Recall the value of the trial without hard pressure; invite them to decide calmly.
- If activate_link exists, invite them to activate the plan in one click; otherwise ask them to reply to this email.
- Do not invent prices, discounts or dates that are not in the data.
Return only the email body.
The facts come from your sheet; the AI only sets the tone. If your gateway (Lemon Squeezy, Stripe…) already sends its own trial-ending email, use this flow as a warmer second reminder or for trials you manage by hand.
Step 5: create the draft and mark the reminder
Connect a Gmail → Create Draft node with recipient {{ $('Code').item.json.email }}, subject Your {{ $('Code').item.json.product }} trial ends soon and the AI text as the body. Drafts let you review before sending, just like subscription renewal reminders or payment card expiry reminders.
Then a Google Sheets → Update Row node that looks up by email + ends_on and writes the stage into reminder_sent.
Once you trust the wording, you can switch Create Draft to Send.
How to test it
- Add a test row with your own email and an
ends_onwithin ~3 days, withreminder_sentempty. - Run the workflow by hand and check that a draft appears and
reminder_sentbecomes1. - Run it again: no new draft should be created (outside the stage-1 window).
- Change
ends_onto tomorrow (leavingreminder_sentat1) and confirm the second reminder is prepared.
Cost and good practices
- Cost: each reminder costs well under a tenth of a cent on the AI API. Set a monthly spend limit in the provider’s dashboard.
- Don’t nag: at most ~2 reminders per trial; if they do not convert, log it and later, if it fits, use a win-back inactive customers flow.
- Don’t invent links or prices: if
activate_linkis empty, the prompt asks them to reply to the email. - Catch failures: add an error workflow so you know if Gmail or Sheets fails, as in n8n error handling.
- Combine it with subscription renewal reminders once the trial becomes a paid plan, and with payment card expiry reminders if the customer leaves a card for the first charge.
Start with ready-made templates
If you’d rather skip the basic n8n setup, download the WhatsApp agent for free or check out the AgentKiosk pack: 8 ready-to-import agents in English and Spanish, each with workflow, prompt and guide, ready to combine with these free-trial ending reminders.


