Home / Barbershops & salons / Win-back text

Rebooking nudge for regulars overdue for a cut

A regular who used to come every 3-4 weeks hasn't been back in 6. Nobody noticed, and now they're sitting in someone else's chair.

⏱ Setup: 1-2 hoursπŸ“Ά Beginner🧩 n8n workflow

How it works

  1. Keep a Google Sheet of clients who agreed to get texts: name, phone, last visit date.
  2. Every morning at 10, the workflow finds anyone whose last visit was 35+ days ago (you pick the number) and who hasn't been texted since.
  3. It texts them your booking link, up to a daily cap you set, writes the date in last_texted so nobody gets it twice, and emails you a count.
  4. Replies come to your email. If someone replies with the word URGENT, your cell gets a text right away, they get a quick 'got it', and the normal reply is skipped.
  5. Before anything else, it checks the request really came from Twilio (signed with your auth token). Anything else gets a 403 and stops. (This applies to the reply webhook; the morning run starts on a schedule.)
Realistic monthly costβ‰ˆ $4.75 + €20/mo
How we got this number
  • Twilio local number (skip if you already have one for another recipe)$1.15
  • Texting registration (A2P 10DLC) monthly fee$2
  • ~120 text segments (~100 nudges plus replies)$1.00
  • carrier fees on ~120 outbound texts$0.60
  • Automation platform (or self-host n8n free)€20
  • Google Sheet client list$0

Assumes ~100 nudges a month. Check first: Square Appointments Plus, Booksy and others include rebooking or lapsed-client campaigns (see the booking tools table). Prices are list prices checked 2026-10-26; see every source.

Plus one-time texting registration (A2P 10DLC): about $19.50 (low-volume brand + campaign vetting). Source

The full setup, step by step

19 steps in one n8n workflow. Everything below is generated from the template itself, so it always matches.

Before you start

You need an n8n account (n8n, or self-host it free) plus your own logins for: Google Sheets Twilio Gmail / Google Workspace.

Each step and what it does

  1. 1
    Trigger (schedule)

    Every morning

    Runs on its own every morning at 10 (your n8n instance's time zone).

    Runsevery day at 10:00

    Then β†’ 3. Config (edit me)

  2. 2
    Trigger

    Incoming text

    Twilio calls this webhook every time someone texts your business number.

    Webhook pathYOUR_N8N_URL/webhook/win-back-sms

    Then β†’ 3. Config (edit me)

  3. 3
    Settings

    Config (edit me)

    One place for everything specific to your business. Every later step reads from here, so this is the only node you have to edit.

    Editthe settings table below

    Then β†’ 4. Scheduled run or text?

  4. 4
    Decision

    Scheduled run or text?

    The schedule and Twilio share this workflow. Scheduled runs do the sending; texts (which carry a Twilio MessageSid) go through the signature check.

    Rulethe request has no Twilio MessageSid (so it's the scheduled run)

    Scheduled runs β†’ 5. Read your list Β· Texts β†’ 11. Check Twilio signature

  5. 5
    Google Sheets

    Read your list

    Reads every row of your Google Sheet list.

    Sheet tabClients

    πŸ”‘ Connect your Google Sheets login on this node

    Then β†’ 6. Due for a nudge?

  6. 6
    Decision

    Due for a nudge?

    Keeps rows with a phone, not opted out, last visit at least the number of days you set, and not already texted since that visit.

    Rulehas a phone, isn't opted out, last visit was at least winback_days ago, and hasn't been texted since that visit

    If yes β†’ 7. Daily cap Β· If no β†’ stops here

  7. 7
    Limit

    Daily cap

    Sends to at most this many people per morning (daily_cap), so replies don't flood you.

    Maxdaily_cap from Config (default 25)

    Then β†’ 8. Send the win-back text

  8. 8
    Send SMS (Twilio)

    Send the win-back text

    Texts each person your booking link, using their first name.

    Sendsthe message shown under Message copy

    πŸ”‘ Connect your Twilio login on this node

    Then β†’ 9. Mark as texted

  9. 9
    Google Sheets

    Mark as texted

    Writes today's date into last_texted (matched by phone) so they aren't texted again until their next visit.

    Sheet tabClients

    πŸ”‘ Connect your Google Sheets login on this node

    Then β†’ 10. Email you a summary

  10. 10
    Send email (Gmail)

    Email you a summary

    One email with how many texts went out today.

    Sendsthe message shown under Message copy

    πŸ”‘ Connect your Gmail login on this node

    End of this path.

  11. 11
    Code (security check)

    Check Twilio signature

    Proves the request really came from Twilio. It rebuilds Twilio's signature (HMAC-SHA1 of your webhook URL plus every field Twilio sent, keyed with your auth token) and compares it to the X-Twilio-Signature header. Uses Node's built-in crypto module: fine on n8n Cloud; self-hosted n8n needs NODE_FUNCTION_ALLOW_BUILTIN=crypto.

    DetailsHow the Twilio security check works

    Then β†’ 12. Signature valid?

  12. 12
    Decision

    Signature valid?

    Only real Twilio requests continue. Anything else (a bot, a fake request, a wrong URL in Config) goes to the 403 step.

    Rulethe signature Twilio sent matches the one rebuilt from your auth token

    If yes β†’ 13. Acknowledge Twilio (text) Β· If no β†’ 19. Reject: not from Twilio (403)

  13. 13
    Reply to request

    Acknowledge Twilio (text)

    Tells Twilio the text was received. The reply goes out separately, so this one sends nothing to the customer.

    Then β†’ 14. Says URGENT?

  14. 14
    Decision

    Says URGENT?

    If the customer's text contains the word URGENT (any capitalization), the urgent path runs instead of the normal reply.

    Ruletheir text contains β€œurgent”

    If yes β†’ 15. Text the owner (URGENT) Β· If no β†’ 18. Forward the reply to you

  15. 15
    Send SMS (Twilio)

    Text the owner (URGENT)

    Texts your cell right away with their number and exactly what they wrote.

    Sendsthe message shown under Message copy

    πŸ”‘ Connect your Twilio login on this node

    Then β†’ 16. Text the customer (URGENT ack)

  16. 16
    Send SMS (Twilio)

    Text the customer (URGENT ack)

    Lets the customer know their message reached you.

    Sendsthe message shown under Message copy

    πŸ”‘ Connect your Twilio login on this node

    Then β†’ 17. Email the owner (URGENT, optional)

  17. 17
    Send email (Gmail)

    Email the owner (URGENT, optional)

    A copy by email. If Gmail isn't connected or fails, the workflow still finishes (the text already went out).

    Sendsthe message shown under Message copy

    πŸ”‘ Connect your Gmail login on this node

    End of this path.

  18. 18
    Send email (Gmail)

    Forward the reply to you

    Emails you what they wrote, so you can answer from your phone.

    Sendsthe message shown under Message copy

    πŸ”‘ Connect your Gmail login on this node

    End of this path.

  19. 19
    Reply to request

    Reject: not from Twilio (403)

    Answers 403 Forbidden and stops. Nothing is texted, emailed or saved.

    Responds403 Forbidden

    End of this path.

Key settings to change

All of these live in the Config (edit me) node. Change them once and every text and email updates.

SettingPlaceholder in the templateChange it to
Business name
business_name
YOUR BUSINESS NAMEExactly how customers know you. It appears in every text.
Booking / calendar link
booking_link
https://YOUR-BOOKING-LINKYour online booking page (Booksy, Square Appointments, SQUIRE, Vagaro, Fresha, Calendly...). Use the short public link.
Hours
hours
Mon-Fri 8am-6pmShort and text-friendly, e.g. Mon-Fri 8am-6pm.
Your email
owner_email
you@example.comWhere the 'new lead' and 'missed call' alerts go.
Your cell
owner_cell
+15555550100In +1 format (+15551234567). Texts from this number that start with WAIT update the wait time.
Twilio number
twilio_number
+15555550199The number you bought in Twilio, in +1 format. Texts are sent from it.
Twilio auth token
twilio_auth_token
PASTE_YOUR_TWILIO_AUTH_TOKENTwilio Console > Account info > Auth Token. Used only to check that requests really came from Twilio. Treat it like a password: don't share the workflow once it's filled in.
Incoming-text webhook URL
twilio_sms_webhook_url
https://YOUR-N8N-URL/webhook/win-back-smsThe exact Production URL of the Incoming text node, the same one you paste into Twilio (Messaging > A message comes in). One character off and every text gets a 403.
List Google Sheet ID
clients_sheet_id
YOUR_GOOGLE_SHEET_IDThe long code in the sheet's URL between /d/ and /edit.
Days until a nudge
winback_days
35How many days after the last visit (or last contact) someone gets the text.
Daily cap
daily_cap
25The most texts sent in one morning.

Message copy: exactly what it sends

Highlighted parts are filled in automatically. Edit the wording right in the node.

SMS to [their phone] Β· step 8
Hey their first name, it's business name. It's been about 5 weeks since your last cut. Want to grab a spot? booking link Walk-ins welcome too. Reply STOP to opt out.
Email to [your email] Β· step 10

Subject Win-back texts sent today: number sent

Texted number sent people from your list today. Replies come to you by email; anyone who replies STOP is opted out by Twilio automatically (also put an x in their opted_out cell).
SMS to [your cell] Β· step 15
URGENT text to business name from their phone number: "their text" Call or text them back now.
SMS to [their phone number] Β· step 16
Got it, we just sent your message straight to the shop's phone. Thanks for the heads-up! - business name
Email to [your email] Β· step 17

Subject URGENT: text from their phone number

They wrote: their text

Your cell was texted and they were told you'll get back to them right away.
Email to [your email] Β· step 18

Subject Reply from their phone number (replied to a win-back text)

They wrote: their text

Reply to them from your phone or the Twilio console.

How the Twilio security check works

Your webhook URL is public, so anyone who finds it could send fake "texts" and make the workflow text people on your dime. Every request Twilio sends is signed, so the first thing this workflow does is check that signature:

  1. Take the exact webhook URL from Config (twilio_sms_webhook_url, or twilio_voice_webhook_url for call events).
  2. Sort every field Twilio posted by name and glue each name and value onto the end of the URL (…BodyhiFrom+1555…).
  3. HMAC-SHA1 that string with your Twilio auth token, base64-encode it, and compare it to the X-Twilio-Signature header (a constant-time compare).
  4. Match: continue. No match, no header, or no URL/token in Config: answer 403 Forbidden and stop.

It's a Code node because n8n's Crypto node can't do HMAC-SHA1. It uses Node's built-in crypto module: allowed on n8n Cloud. Self-hosted n8n: set the environment variable NODE_FUNCTION_ALLOW_BUILTIN=crypto (on your task runners too, if you use them), or the node errors.

The auth token lives only in Config. Never paste it into the code, and don't share your workflow export once it's filled in.

Hook it up

  1. Make a Google Sheet with a tab named Clients and columns name | phone | last_visit | last_texted | opted_out. Phones in +1 format, dates as YYYY-MM-DD (format the columns as plain text). Start with an export of your client list from your booking tool if it has one, then keep last_visit current (paste a fresh export weekly, or update it at checkout).
  2. Fill in Config (edit me): sheet ID, how many days counts as overdue (winback_days), the daily cap, Twilio number, auth token and webhook URL.
  3. Connect Google Sheets, Twilio and Gmail credentials.
  4. In Twilio > Phone Numbers > your number > Messaging: 'A message comes in' > Webhook, HTTP POST, https://YOUR-N8N-URL/webhook/win-back-sms. Paste the exact same URL into twilio_sms_webhook_url in Config. A number has one 'message comes in' webhook, so if you run several of these workflows on one number, point it at only one of them.
  5. Only include people who agreed to get texts from you. Activate: every morning at 10 it texts up to the daily cap, once per visit.

Security: the Check Twilio signature node rejects (403) anything not signed with your Twilio auth token. Self-hosted n8n: set NODE_FUNCTION_ALLOW_BUILTIN=crypto. Don't share this workflow once your token is in it.

Test it before you trust it

Skip the clicking

Get the ready-to-import n8n template

Every step above, already wired up. Paste it into n8n, add your logins, fill in your business info and you're live.

Done-for-you setup

Rather not build it yourself?

Set it up yourself, or I'll set it up for you in a week.

  • I set up the same templates on this site in your own n8n, Twilio and Google accounts, so you own everything.
  • Your business info, booking link and message wording filled in, and every test on the setup page run with you.
  • Live within a week of getting your logins.
Request a setup

Tell me your trade and how customers reach you today. I'll reply by email with next steps.

← All barbershops & salons recipes