Two reminders fire at once.
The member gets one message.
A member's plan expires on the same day their balance falls due, and it is their birthday. Three jobs, three messages, one irritated member. Ultimate CRM hashes every outgoing message and refuses to send the same text to the same number twice inside twenty-four hours. The guard sits inside the sender, so every job, every screen and every webhook inherits it without being told.
01 / The duplicate guard
How one message stays one message
This is the part of the product we are proudest of and the part no competitor's feature list mentions, because writing it means admitting the problem exists.
-
Something decides to send
A renewal job, a balance-due job, a bill being created, a fingerprint on the door, or a staff member pressing send by hand. There are more than a dozen places in the software that can start a WhatsApp message.
-
The message is hashed before it leaves
Gym, the member's number, and the exact finished text — after the placeholders have been filled in — go through SHA-256. Two messages that read identically produce the same hash. Two that differ by a single rupee do not.
-
The last twenty-four hours are checked
If that hash has already been recorded for this gym and this number inside the window, the send is dropped and the reason is logged as duplicate_suppressed. Nothing reaches the member. Nobody had to remember to check.
-
A race still only sends once
Two jobs firing in the same second would both look, both see nothing, and both send. A unique constraint in the database catches the second one on write and it is treated as the duplicate it is.
-
You can still overrule it
A staff member who genuinely wants to resend the same text can. That send is recorded separately and marked as a manual override, so it shows up as a human decision in the history rather than as the system misbehaving.
02 / Read this before you buy it
Whose WhatsApp number is this, really?
Yours. You scan a QR code once, the way you would for WhatsApp Web, and from then on the software drives your own WhatsApp session. Messages arrive from your gym's number, members reply to your gym's number, and those replies land in your gym's WhatsApp like any other conversation.
That is the honest description, and it has consequences we would rather you heard from us. This is not Meta's WhatsApp Business Platform. There is no green tick from us, no verified-business badge, no message-delivery contract, and no service level we could promise you even if we wanted to. If your session is logged out on the phone, sending stops until it is scanned again.
In exchange, there are no per-message platform fees, no template pre-approval queue, and no waiting on Meta to approve a change to your renewal wording. Most gyms make that trade knowingly. We would rather you made it knowingly too.
The sending paths, plainly
- Default
- Your own WhatsApp session, connected by QR
- Second engine
- A paid add-on, switched on per gym, which does report delivered and read
- Reseller route
- A third-party WhatsApp Business reseller, campaign and template based
- Delivery receipts
- On the paid add-on only
- Delivery guarantee
- None, on any path
03 / The messages that send themselves
Every trigger, and the switch that turns it off
Each row is an independent switch on one settings screen. Turning a category off stops it for the whole gym, immediately, with no support ticket.
| Message | When it fires | Your wording? |
|---|---|---|
| New enquiry | The moment an enquiry is created — walk-in, the member app, a lead ad, or the QR on your counter | Yes, full template |
| Bill created | When a subscription is assigned and the invoice is raised | Yes, full template |
| Renewal reminder | 45, 15, 7 and 3 days before the expiry date, depending on how long the plan runs | A suffix you write, appended to the standard text |
| On the expiry date | The day the membership ends | A suffix you write |
| After expiry | 3 and 7 days after, if they have not renewed | A suffix you write |
| Balance due | On the payment date the part-payment was scheduled for | A suffix you write |
| Stopped turning up | Seven consecutive days without a check-in, and only for members whose membership is still active | Yes, full template |
| Birthday | On the day | Yes, full template |
| Check-in welcome | Off the attendance record itself, so it fires for a fingerprint, a card, a face or a QR without knowing which | Yes, full template |
The seven-day rule for members who have stopped coming is deliberate. It used to be fourteen, which was long enough that the member had already joined somewhere else by the time anybody rang.
04 / The wording
Your voice, not ours
Every template above is a text box on one screen. Type what your gym would actually say, in the language your members read, and drop a placeholder in where a name belongs.
You can also set the salutation the software uses in front of a name, which matters more than it sounds in a market where Mr, Sir and a bare first name are three different relationships.
One nice detail on the check-in welcome: it carries a rotating motivational line, drawn from a pool of 365 and tracked per member, so the same person does not get the same sentence twice until the pool runs out. Then it resets and starts again.
Placeholders that fill themselves in
- {cust_first_name} — the member's first name
- {cust_last_name} — their surname
- {MemberName} and {GymName} on the check-in welcome
Anything you type that is not a known placeholder is sent exactly as typed. It is not silently blanked out, so a typo shows up in your own test message rather than in four hundred members' phones.
Ask us to try to double-send
On the call, pick a test number, fire two identical reminders at it, and watch the second one get dropped. It takes about a minute and it is the part of the demo people remember.
Or email crm.sales@proultimate.com directly.