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:
- Daily trigger: a Schedule Trigger node runs at 09:20.
- Read jobs: a Google Sheets node reads your “Recent jobs” (or “Post-sale”) sheet.
- 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.
- 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.
- 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),notesandreminder_sent(empty or1/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
- Add a test row with your own email and a
service_dateabout 7 days ago, 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
service_dateto about 21 days ago (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 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_linkis 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.


