The message is the easy part
When people plan a reminder flow, almost all the attention goes to the message: the template, the timing, whether it goes on WhatsApp or email. That part is easy to get right.
The hard part is the boring question underneath: how does the system know this customer has already been reminded?
If the honest answer is "it checks whether today is three days after the invoice date", you have a system that will double-send the first time anything goes slightly wrong. And something always goes slightly wrong.
If you are still deciding what to automate first, start with how to automate lead follow-up on WhatsApp. This post is about what happens after you switch it on.
Where the second message comes from
Duplicates almost always come from one of four places.
1. Retries. The WhatsApp or email provider takes too long to answer. The tool assumes the send failed and tries again. The first send actually went through. The customer gets two.
2. Overlapping runs. The job runs every 15 minutes. One run is slow because the sheet has grown to 4,000 rows. The next run starts before the first one finishes. Both pick up the same customers.
3. The rule is based on dates, not on history. "Send if due date is today" is true all day. If the job runs more than once a day, or someone re-runs it by hand to "make sure", every run sends again.
4. Edits that restart the clock. A team member changes the due date or the phone number. The workflow treats it as a new record and the whole sequence starts over.
Skipped customers come from the mirror image: a run crashes halfway, the next run's date filter has moved on, and the people in the second half are never picked up.
The fix is a field, not a smarter tool
Switching from Zapier to Make to n8n to a custom script does not fix this. The fix is the same in every tool: the record itself must remember what was sent.
On every customer, invoice or lead the automation touches, keep a small set of fields:
- Step — which reminder this is in the sequence (first reminder, second, final)
- Sent on — the time that step actually went out, written only after the provider confirms
- Attempt status — sending, sent or failed, so a retry knows what it is retrying
- Message ID — the ID the WhatsApp or email provider returns, so you can prove what went out
- Stop flag — paid, replied, or "do not contact", checked before every send
Then the rule changes from "send if due date is today" to "send step 2 if step 2 has no sent-on time and the stop flag is clear". Run that job once or ten times — the customer still gets one message.
Engineers call this property idempotency: doing the same thing twice has the same effect as doing it once. You do not need the word. You need the field.
Three rules for every reminder flow
Mark before you send, confirm after. Set the status to "sending" first, then call the provider, then write "sent" and the message ID. If the job dies in the middle, the next run sees "sending" and checks instead of blindly firing again.
One run at a time. Use a simple lock so a new run will not start while the previous one is still going. Most tools have a setting for this; in a custom script it is a few lines.
Never let the date be the only memory. Dates decide when a step is due. The record decides whether it has already happened. Keep those two jobs separate.
What to check in the flow you already have
You do not need to rebuild anything to find out if you are exposed. Ask whoever set up the automation four questions:
- If this job runs twice in a row, does anyone get two messages?
- Where is it recorded that a customer was reminded, and can I see it on the customer's row?
- What happens if the provider times out — retry, skip or alert?
- If a customer pays at 10am, can the 11am reminder still go out?
If any answer is "it should be fine" rather than a field you can point to, that is the first fix. It is usually a small change, and it is the difference between a team that trusts the automation and a team that quietly goes back to manual reminders.
We cover where automation actually pays off for small teams in AI and automation for small businesses in India, and how we build these flows on our automation service page.
The short version
A reminder flow is not "a message on a schedule". It is a small record of promises: what is due, what was sent, and what should stop. Build that record first and the message takes care of itself.
If your reminders double-send or go missing and you want a second pair of eyes on the flow, get in touch.
Want this built for your business?
Book a 15-minute teardown and we'll map the first system to build.
Related
