Build a follow-up nudge cadence with a tone that escalates gently
- Level
- intermediate
- Time to complete
- 90 min
- Prerequisites
- 4
What you will buildA linear nudge ladder - day-offset plus a predefined tone - that only runs while you are still waiting to hear back. About 90 minutes, intermediate.
What You Will Build
You will build a follow-up engine: a small, ordered ladder of nudges that fires for you when a contact goes quiet after your last email, each nudge in a tone that escalates gently from warm to firm, and the whole thing wired to stop the instant the person replies.
The shape is deliberately simple - a linear list, not a visual flow canvas with branches. Each row in the list is just two things: how many days to wait, and which predefined tone to use. On top of that sits one gate that decides whether any nudge is allowed to fire at all. By the end you will have a data model for the ladder, four opinionated defaults a new user never has to configure, a next-nudge date computed in code against a business-day calendar, the reply gate that keeps it polite, and CRUD controls a user cannot hurt themselves with.
This is drawn from a study of thirteen follow-up and reminder tools. Where they agree, you will copy them. Where they leave a gap - shipping no defaults, and never attaching tone to the step - you will fill it.
Prerequisites
- A data store you can add two tables to (examples here use Postgres SQL, but any relational store works).
- A backend or scheduled job that can run once a day to decide which nudges are due.
- A way to tell, per conversation, whether you are waiting on the other person or they are waiting on you. This is the single hard dependency - without it you cannot build the gate.
- A small, fixed set of message templates or prompts, one per tone, so each nudge has a voice to render.
Tip
If you only have time for one thing, get the "whose turn is it" signal right first. Every other part of this ladder is cosmetic next to the gate. A fast cadence with a broken gate is a spam machine; a plain cadence with a correct gate is a polite assistant.
Mental Model
A follow-up ladder is just two questions per row - how many days to wait, and in what tone - and one question for the whole ladder: are we still waiting to hear back?
Hold three ideas straight and the rest follows. First, the offset on each nudge is relative, not a calendar date. It counts days since your last unanswered email, computed fresh each time, the way a sales cadence counts a relative day number from when the conversation started - so the schedule tracks the actual conversation instead of drifting. Second, the tone is a property of the step, stored on the row, not a global setting and not something the user types free-hand. Third, the gate lives once, globally, above the whole ladder: no per-nudge "stop on reply" toggle, because stopping on reply is not optional - it is the definition of the feature.
Resist the urge to make this a branching flow builder. Our version has no conditional splits, no A/B variants, no multichannel steps. It is one ordered list and one gate. That is the whole engine.
Steps
Work in order. Steps 1 and 2 set the model and the defaults; the rest build the date math, the gate, the tone rendering, and the safe CRUD.
Model a nudge as an offset plus a tone
Create two tables. One holds the ladder (the ordered nudges). The other is the small, closed set of tones - a lookup table, not a free-text column, so a user can never invent a tone.
create table tone (
key text primary key, -- 'warm' | 'brief' | 'formal' | 'firm'
label text not null, -- one friendly word shown in the UI
hint text not null -- one-line hover hint
);
create table nudge (
id uuid primary key,
day_offset int not null check (day_offset >= 3), -- days since last unanswered email; historical minimum is 3
tone_key text not null references tone(key), -- locked to the predefined set
position int not null -- source of order; always sorted by this
);
You know this worked when you can insert a nudge with tone_key = 'warm' and the database rejects an insert with day_offset = 1 or with a tone that is not in the lookup table.
Ship four opinionated defaults
Do not drop a new user into an empty editor. Of the thirteen tools studied, only one shipped a real cadence out of the box; the rest make you build the schedule from scratch. Ship four sensible nudges already populated, with widening gaps and an escalating tone.
insert into tone (key, label, hint) values
('warm', 'Warm', 'Friendly and personable'),
('brief', 'Brief', 'Short and direct'),
('formal', 'Formal', 'Professional check-in'),
('firm', 'Firm', 'Polite but final');
insert into nudge (id, day_offset, tone_key, position) values
(gen_random_uuid(), 3, 'warm', 1),
(gen_random_uuid(), 7, 'brief', 2),
(gen_random_uuid(), 14, 'formal', 3),
(gen_random_uuid(), 21, 'firm', 4);
You know this worked when a brand-new account already has a working four-rung ladder - 3, 7, 14, 21 days, warm to firm - that it can use as-is or tune.
Sources
- Salesloft Cadence Day: a relative day number from enrollment, not a calendar datehelp.salesloft.com
- Mixmax: default delay is 3 weekdays; skips weekends and US holidayssuccess.mixmax.com
- HubSpot Sequences: business-days-only default, Move up/down reorder, edits hit enrolled contactsknowledge.hubspot.com
- Instantly campaign options: explicit stop-on-reply and stop-on-auto-reply toggleshelp.instantly.ai
- Apollo rulesets: finish on reply, pause on out-of-office with auto-resumeknowledge.apollo.io
- NN/g: action-specific confirmation buttons and always offer undonngroup.com