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:

  1. Daily trigger: a Schedule Trigger node runs at 09:20.
  2. Read trials: a Google Sheets node reads your “Free trials” sheet.
  3. Filter by days left: a Code node keeps rows ending in ~3 or ~1 day that have not yet had that stage’s reminder.
  4. 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.
  5. 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), notes and reminder_sent (empty or 1 / 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

  1. Add a test row with your own email and an ends_on within ~3 days, with reminder_sent empty.
  2. Run the workflow by hand and check that a draft appears and reminder_sent becomes 1.
  3. Run it again: no new draft should be created (outside the stage-1 window).
  4. Change ends_on to tomorrow (leaving reminder_sent at 1) 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_link is 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.