Skip to content

Renewal reminders that roll themselves to next year

A standalone n8n template that texts a service business owner before licenses, insurance and registrations run out. Each line of the text has a Done link that moves the date to next year, and the page it opens has an Undo. What the live test showed.

By Mike Matthews ·
  • build log
  • automation
  • n8n
  • twilio
  • sms
  • testing

Every service business has a short list of dates that decide whether it can legally work: the contractor license, liability and workers’ comp insurance, the city business license, truck tags, the annual filing, a bond. They come around once a year or once every two years, which is exactly often enough to forget them. A lapsed license can stop you pulling permits. A lapsed policy means working a job without coverage.

Those dates usually live in someone’s head, a paper folder or an email from last year. The seventh standalone template puts them in one place and texts the owner before each one.

What it does

The list lives in the workflow itself, one line per item: name, due date, how often it repeats, and an optional note like who to call. Four to ten lines that change once a year do not need a spreadsheet.

Every morning at 8 it sends one text with anything 60, 30, 14, 7, 3 or 1 days out, due today, or overdue. Overdue items come back every day until they are handled. On the 1st of the month you get a look at the next 90 days. The first morning after you switch it on, it texts you what it is tracking and what is next, and any line it cannot read is named, with the date formats it accepts.

One text a day at most, even if the schedule fires twice. There is no database: what it remembers lives in the workflow’s own storage, which n8n keeps for published workflows.

This is the part that makes it more than a calendar reminder. Every line of the text ends with a Done link. You renew, you tap it, and a small page tells you what changed.

A yearly item moves to next year. It counts from the old due date, not from the day you tapped, so renewing a week early does not drag next year’s reminder a week earlier. A one-time item just stops. Each link carries a random one-time code for that item and that due date, so a used link, or a link from an old text, changes nothing.

The first version had a hole in it. If you tapped Done by mistake, the fix was supposed to be “change the date in your list”. But the rolled date was stored separately, and it beat the list. Changing the list to a later date worked. Changing it back to the real, earlier date did not. The one fix I was telling people to use did not work in the one direction that mattered.

Two changes closed it. The workflow now remembers what the list said at the moment of the tap, so any change to that line afterwards wins, earlier or later. And the page that confirms a Done has an Undo link, which puts the item back exactly as it was, once.

What the live test showed

I ran it on n8n Cloud with a real Twilio number and my own cell getting the text. Two test items: a yearly one due in three days and a one-time one due the next day. The schedule was set to a single run a few minutes ahead.

The run sent one text: the startup message and both items, each with its Done link. Then I tapped through everything: Done on the yearly item moved it to September 25, 2027 and said the first reminder would come July 27, 2027, 60 days before. The same link again said nothing changed. Undo put it back to Friday, September 25, 2026. Undo again did nothing. The original Done link worked again after the undo. Done on the one-time item stopped it.

A second scheduled run the same evening, after publishing the workflow again, sent nothing, and everything it had remembered was still there.

It also ran in a local copy of n8n against a fake Twilio I control, which is where the harder cases went: a text Twilio refuses (kept, and sent the next morning), a date changed in the list after a Done tap (the list wins), junk in a link (nothing changes), and the example phone numbers left in (it stops and says why).

What is not covered

I did not read the delivery status back from Twilio, only that Twilio accepted the text. A real next morning, a real refusal and the 1st-of-the-month look ahead were covered locally and by the automated checks, which run the workflow’s own code with the clock frozen, not live.

The template, the texts it sends, the test notes and the 61 automated checks are in their own repo on GitHub.

Next step

Want this kind of thinking applied to your business?

Fifteen minutes with Mike. We look at what you're actually doing by hand, and you get a straight answer on what's worth automating — including "nothing yet," which is the answer often enough that it's worth saying out loud.