Disclosure first: I run a small Gumroad shop, iTaylor Solutions, that sells n8n kits for appointment businesses. This workflow is free and doesn’t need any of them.
I wanted a review request flow for appointment businesses (clinics, salons, home services) that does the boring safety parts by default: it asks everyone the same way, never checks how happy someone is before sending them to the review page, doesn’t ask the same person twice in a short window, and honors STOP and unsubscribe. Google’s review policy doesn’t allow “only send happy customers to Google”, and the FTC’s Endorsement Guides say that kind of filtering can be deceptive, so there’s no rating step at all.
How it works
- A completed appointment comes in one of two ways:
- Webhook “Receive Completed Appointment” (Header Auth). Replies 202 if the payload is valid, 400 with the list of errors if not.
- Schedule “Check Sheet Every 15 Minutes” reads an Appointments tab. Disabled by default; turn it on if your booking tool can’t call a webhook.
- Wait Before Asking holds it for
delay_minutes(default 120). - It reads the Review_Log and Opt_Outs tabs, then Decide Eligibility skips anyone who was already asked for that appointment, anyone asked inside the cooldown (default 90 days), and anyone who opted out.
- Route By Action sends an email over SMTP. SMS is optional and off by default. When on, it only texts people with SMS consent recorded, a valid number, no STOP on file, and inside the send window (default 10:00 to 19:00, Mon to Sat, your timezone). By default it texts only when email isn’t possible.
- Every send or skip is written to Review_Log with the reason.
Two extra webhooks handle the opt-out side:
- Receive SMS Reply: STOP, STOPALL, UNSUBSCRIBE, CANCEL, END, QUIT, REVOKE and OPT OUT are saved as opt-outs. START and UNSTOP opt back in.
- Receive Unsubscribe Click: the email has a signed unsubscribe link. Links that don’t match the log are rejected, so nobody can unsubscribe someone else by guessing a URL.
Main nodes
Receive Completed Appointment, Check Sheet Every 15 Minutes, Review Request Settings, Validate Appointment, Wait Before Asking, Read Review Log, Read Opt-Outs, Decide Eligibility, Route By Action, Send Review Email, Send Review SMS, Write Review Log, Receive SMS Reply, Read Reply Keyword, Save SMS Preference, Receive Unsubscribe Click, Verify Unsubscribe Link, Save Email Opt-Out. 33 working nodes plus 7 sticky notes with the setup steps.
What you configure
- A Google Sheet with three tabs: Appointments, Review_Log, Opt_Outs (column headers are in the sticky notes). Put the sheet ID in the 7 Google Sheets nodes.
- Credentials: Google Sheets OAuth2, SMTP, Header Auth for the webhook. HTTP Header Auth for your SMS provider only if you turn SMS on.
- The Review Request Settings node: business name and address, from/reply-to email, your review URL, timezone, delay, cooldown, SMS window, unsubscribe URL and the message templates.
- The SMS request body is Telnyx-style (
from,to,text). The setup guide shows what to change for Twilio or Plivo.
Setup should take about 30 minutes.
Testing and limits, so nobody is surprised
- I built it with AI help and tested it myself on self-hosted n8n 2.45.6: 37 scenarios with mocked Sheets, SMTP and SMS, plus live webhook checks.
- Not tested yet: real Google Sheets, real SMTP or SMS providers, n8n Cloud, or other n8n versions. If it breaks on yours, post here and I’ll look.
- It doesn’t promise any number of reviews, and it’s not legal advice. It’s built with consent and opt-outs in mind, but check your own TCPA/10DLC and email rules, and don’t put health details in messages.
Get it
- The workflow JSON plus a setup guide PDF, free on Gumroad (asks for an email): Free n8n Review Request Workflow for Appointment Businesses (No Review Gating)
Happy to hear how others handle cooldowns or STOP keywords across providers.