Blog · · 5 min read

How to remind customers to book a post-sale follow-up appointment with n8n and AI

Step-by-step guide so n8n checks recent jobs in Google Sheets every morning, spots the ones due for a check-in and drafts a clear Gmail reminder with AI to book the post-sale follow-up.

You finished the job, the customer was happy… and two weeks later nobody booked the follow-up. You miss a retention opportunity and they assume “everything is done” without a check-in that could have prevented an issue or a lost renewal.

In this guide you will build an n8n workflow that every morning checks a register of recent jobs in Google Sheets, finds the ones due for a follow-up (for example ~7 or ~21 days later) and drafts a clear Gmail reminder with AI so the customer books the post-sale appointment. You review the draft and send it.

This is not the same as an appointment reminder for a booked slot: there the appointment already exists and you only need to prevent a no-show; here they still need to book the follow-up. It also does not replace a customer satisfaction survey: that measures how the service went; this pushes the next useful contact.

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 jobs: a Google Sheets node reads your “Recent jobs” (or “Post-sale”) sheet.
  3. Filter by days since the job: a Code node keeps rows ~7 or ~21 days after the service that have not yet had that stage’s reminder.
  4. AI reminder: a Basic LLM Chain node writes a warm email that recalls the work done, proposes the follow-up and offers the booking 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 “Recent jobs” sheet with these columns: customer, email, service, service_date (YYYY-MM-DD), follow_up_reason (optional), booking_link (optional), notes and reminder_sent (empty or 1 / 2).

You can fill the sheet by hand when you close a job, or with another n8n workflow that writes each closure. This guide assumes the rows are already in Sheets.

Step 1: prepare the recent-jobs sheet

Keep service_date in a consistent date format and leave only closed jobs that still need a follow-up (archive ones that already booked or declined). In follow_up_reason note something useful if you have it (“check the fit after 7 days”, “post-install control”, “discuss an upgrade”); otherwise leave it empty. In booking_link put your calendar, Calendly or booking-form URL; if you do not have a fixed one, leave it empty. In notes capture preferences (“prefers mornings”, “WhatsApp”, “12-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 “Recent jobs” sheet.

Step 3: filter pending follow-ups

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.service_date) continue;
  const serv = new Date(c.service_date); serv.setHours(0, 0, 0, 0);
  const days = Math.round((today - serv) / 86400000);
  if (days < 0 || days > 30) continue;
  const already = Number(c.reminder_sent || 0);
  let stage = null;
  if (already < 1 && days >= 6 && days <= 8) stage = 1;   // ~7 days
  else if (already <= 1 && days >= 20 && days <= 22) stage = 2; // ~21 days
  if (!stage) continue;
  out.push({ json: { ...c, days, stage } });
}
return out;

Each job gets at most two follow-up reminders. If nothing is due, the workflow ends without spending AI credits. You can tweak the windows (6–8 and 20–22) for your industry.

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 post-sale follow-up for [BUSINESS NAME]. Write a short email to
{{ $json.customer }} inviting them to book a follow-up appointment after the
“{{ $json.service }}” service on {{ $json.service_date }} ({{ $json.days }} days ago).
Follow-up reason (mention it if present; if empty, talk about a useful general check-in): {{ $json.follow_up_reason }}
Booking link (include it if present; if empty, do not invent one): {{ $json.booking_link }}
Notes: {{ $json.notes }}
- Warm, professional tone, max 7 sentences.
- Recall the work done without hard upselling; focus on protecting the result.
- If booking_link exists, invite them to book in one click; otherwise ask them to reply with a preferred time window.
- Do not invent prices, discounts or appointment 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 CRM or booking tool already sends its own email, use this flow as a warmer second reminder or for jobs you close by hand.

Step 5: create the draft and mark the reminder

Connect a Gmail → Create Draft node with recipient {{ $('Code').item.json.email }}, subject Shall we book your {{ $('Code').item.json.service }} follow-up? and the AI text as the body. Drafts let you review before sending, just like appointment reminders or new-client welcome onboarding.

Then a Google Sheets → Update Row node that looks up by email + service_date 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 a service_date about 7 days ago, 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 service_date to about 21 days ago (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 job; if they do not book, log it and later, if it fits, use a customer satisfaction survey or a win-back inactive customers flow.
  • Don’t invent links or slots: if booking_link is empty, the prompt asks them to reply with a preferred time window.
  • Catch failures: add an error workflow so you know if Gmail or Sheets fails, as in n8n error handling.
  • Combine it with appointment reminders once the customer has booked the follow-up, and with reducing appointment no-shows so that post-sale slot does not go empty.

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 post-sale follow-up appointment reminders.