“Actually yes. We do see a difference.”
Replying to my message: “From the revenue compared from November to December, we see an increase of 18 to 20%.” December is their slow month.
They were not short of customers. They were short of second visits. Hijama has a natural repeat cycle of a few weeks, so every lapsed customer was a booking the diary had already earned and then forgotten to collect.
December is their slow month, and the comparison runs November to December. The lift happened against the season, not with it.
A new booking cancels every sequence that customer is sitting in. Without it, someone who rebooks on day 2 still gets “we miss you” on day 21, and the practice looks like it is not paying attention.
Five, and the last one is the reason it still runs.
Most retention campaigns are a list of messages on a calendar. This one is a state machine, which is why it never contradicts itself.
Booked, rescheduled, cancelled, done, reviewed. A customer is in exactly one, and the system always knows which.
Every workflow wipes prior state before writing its own. Stale state is what makes automations send nonsense.
A new booking drops the customer out of every running sequence. One rule, enforced in all five.
Within the hour of finishing, while they still feel the result. The ask fires 60 minutes after the appointment ends, and only once. A customer who has already reviewed gets a different message with no ask in it, because asking twice is how you lose the third.
Hijama has a natural repeat cycle, so the nudges sit at 3, 5 and 8 weeks from the customer’s own last visit rather than on a shared campaign date. The 8-week message carries an offer with a 7-day expiry, because a win-back without a deadline is just a newsletter.
The site led with the business name, not the thing people search for. Titles, meta descriptions and social tags were rewritten to open with the category term and the outcall angle, and to name the specific treatments people actually type. Competitors were ranking on exact-match domains; the fix was to match their title placement without owning their domain.
The automation decides who someone is. The messaging platform decides when to speak. Neither does the other one's job.
Timers are the fragile part of any retention system, and they are the part that has to survive somebody changing their mind. Keeping every timer in one place, with exactly one escape hatch, is what makes the whole thing predictable.
An earlier build let state live in more than one place, and long-running timers had no reliable way out. People who had already rebooked kept receiving messages written for people who had not.
Two systems each believed they knew whether someone had rebooked. When they disagreed, the timer won.
Exactly one system writes state. Everything else reads it. Disagreement stops being possible.
Every waiting sequence checks the same single condition. A rebooking pulls the customer out of all of them.
391 lapsed customers were backfilled into the return sequence on day one, out of a base of 511. They had all been treated, none had rebooked, and until then nothing had ever gone back to them.
Written, not generated. Every one has a job, and the two that look similar are deliberately different.
| When | What it does |
|---|---|
| Booked | Confirms the slot and tells them how to prepare |
| Rescheduled | Confirms the new time and repeats the prep |
| Cancelled | Acknowledges without guilt, offers a one-tap rebook |
| Morning of | Checklist and what to expect, sent at 8am |
| Done, first time | Aftercare, then the review ask on a tracked link |
| Done, already reviewed | Aftercare only. The ask is removed, because they already gave it |
| 3 weeks | Why the cycle matters, and an open door |
| 5 weeks | Social proof, other people are back |
| 8 weeks | A dated offer that expires in 7 days |
| 2 weeks post-cancel | Still want to come in? |
| 6 weeks post-cancel | Final touchpoint, then we stop asking |
A customer who has already left a review gets aftercare with no review request in it. It costs one extra branch to build and it is the difference between a practice that pays attention and one that runs a mailing list.
A five-star practice was invisible on the term its own customers type. The title tag opened with the business name, which nobody searches for.
The clinics ranking above them held exact-match domains, which cannot be taken. What could be taken was title placement, because Google reads a title left to right and so does a person scanning results. Meta descriptions and social tags were rewritten to match, then redeployed.
Nudges at 3, 5 and 8 weeks from each customer’s own last visit, ending in a dated offer. 511 customers carried into it at launch.
Fires an hour after the appointment, with a tracked link that remembers who already reviewed so nobody is asked twice.
Titles, meta descriptions and social tags rebuilt to lead with the category term and the outcall angle, then redeployed.
Instrument the sequence properly from day one. The revenue movement is real and the owner confirmed it, but the attribution is a month-on-month comparison rather than a controlled read. Holding back a small control group would have turned a believable number into a defensible one, and it would have cost nothing to do at the start.
Five workflows, eleven messages, and a search rewrite that took a category term.
Everything above is the bottom line. If that is what you came for, you already have it.
What follows is the full working: 6 diagrams and 10 sections of working, the analysis behind each decision, and why it went that way instead of the obvious way. It is long on purpose. It is written to be checked, not skimmed.
Only wanted the overview? Stop here. You will not miss a single result — every number is already above this line.