Skip to content
offpeek

Revenue recovery · UAE service businesses

Your calendar is leakingmoney.

We find the leaks in your own booking history: no-shows, unfilled cancellations, customers who stopped coming, hours that sit dead. Then we close them for you.

Three of the four need no discount at all.

One export from whatever system you use. No login, no switch.

Four
leaks we look for, three of which need no discount at all
AED 8,000 to 11,000
a month, on a salon grossing AED 150,000. Illustrative arithmetic, not a customer result
1 in 5
of every audience held back at random, so the figure we invoice is a difference

Leaking, this month

AED 9,500

Illustrative. A salon grossing AED 150,000 a month, at a typical no-show rate, is losing roughly AED 8,000 to 11,000 across these four leaks. We find your real number.

Tuesday · Chair 2

Illustrative day sheet. One chair, one Tuesday. Not a customer's data.
TimeSlotValue
11:00ColourBooked420
12:00Blow-dryNo-show150
13:00Cut & beardBooked120
14:00–Empty110
15:00CutCancelled 13:40105
16:00ColourBooked420

Regulars who stopped coming

–

The fourth leak never appears on a day sheet at all.

Unrecovered, this day

AED 365

Illustrative day sheet. One chair, one Tuesday. Not a customer's data.

The four leaks

Four ways a calendar loses money.

Every service business is already losing revenue it has earned. It doesn't show up as a loss. It shows up as an empty chair, a cancelled Saturday, and a customer who quietly stopped coming. Three of these four are fixed without discounting anything.

  1. No discount

    No-shows

    Someone booked and didn't turn up. The slot was never offered to anyone else.

    Timed confirmations and reminders over WhatsApp, aimed at the bookings most likely to be missed based on that customer's own history in your export. Your front desk marks attended or no-show in one tap, which is what keeps the numbers honest.

    A no-show improvement is a rate change over time, not a booking anyone can tag. It appears in your report as recovered value, measured against your own history.

  2. No discount

    Cancellations nobody refills

    A prime slot frees up on Thursday afternoon and stays empty, because nobody knew it was available.

    When a booking cancels, the freed slot goes to the customers most likely to want it, at full price. There is no discount here, and the page they land on shows no struck-through price, because there is no concession to show.

    Of the four, this is the shortest distance between noticing and selling.

  3. No discount

    Customers who stopped coming

    They came every six weeks for a year, then stopped. Nobody followed up.

    Your export shows who has lapsed, what they used to spend, and how often they used to come. They get a message from your WhatsApp, usually just an invitation back at your normal price.

  4. Shallow, measured discount

    Hours worth discounting, and the ones that aren't

    Some hours are genuinely dead. A small, targeted incentive on those, and only those, creates business that wouldn't have happened.

    Every hour of your week is scored on absolute fill, not on how it compares to your own average, and lands in one of three tiers.

Scored on absolute fill

One chair, one Wednesday, every hour scored.

Sort

Sort it either way. The hours we are allowed to touch are the same hours either way, because the tier is computed from the fill rather than chosen. Six of these nine sell on their own, and putting an offer on those would be paying for a booking that was already coming.

Sorted by hour.

  1. 10:0058%Ordinary
  2. 11:0019%Dead
  3. 12:0044%Ordinary
  4. 13:0012%Dead
  5. 14:0037%Ordinary
  6. 15:0022%Dead
  7. 16:0051%Ordinary
  8. 17:0086%Contested
  9. 18:0094%Contested
Dead
Under about 25% fullAnything, including a broadcast. There is no full-price customer to displace.
Ordinary
Normal fillShallow offers, aimed at chosen customers only. Never a broadcast.
Contested
Your best, busiest hoursNever discounted. These are where we move demand from, not to.

Illustrative fill rates on one chair. Your own come from your file, and the tier of every hour is computed from it.

An offer only pays if the share of bookings that are genuinely new beats the discount. We launch at around 10% off the ticket, so the bar is 10%. Offers are also floored at your variable cost: consumables, payment fees and staff commission. In UAE salons that is often 30 to 50% of the ticket, which is why a small discount can quietly lose money.

Where we can, an offer is a credit, like AED 30 toward a Tuesday, rather than a percentage off. It protects your list price, and the customer always sees the true amount they will be charged.

How it works

Export, report, switch it on.

Step 1

Send us your booking history.

One export from whatever system you already use. A CSV is fine. A messy one is fine. Appointments, services, prices, and cancellations if your system records them. We map the columns for you, and you confirm the mapping before anything is computed.

You don't switch booking systems, install anything, or give us a login.

Reading your export
  • Booking export received
  • Columns mapped, in any layout
  • Reading your booking history
  • Four leaks computed from your own rows

An illustration of the steps, not a live import. Nothing is uploaded from this page.

Two questions we'll ask

  • How many staff are actually on shift, by day? Without it we infer your capacity from overlapping bookings, which under-counts a quiet business badly and hides the hours that are genuinely dead.
  • Does your export include the date each booking was made? With it we can see whether the queue for your best hours is lengthening. Useful, not required.

Step 2

Get your leak report. Free, and yours either way.

Within a few days you get a report built entirely from your own file: no-shows and what they cost you, cancelled prime slots that went unsold, dormant customers and what they used to be worth, and which hours of your week are dead, ordinary or contested. Every figure names the evidence behind it.

Every number in that report is modelled. It is what your history implies, not what we have proven, and it is labelled that way throughout. It is not a number anyone should bill on.

You can read the report, thank us, and stop.

Leak report · last 90 days
No-showsmodelled
3,200
Cancelled prime slots, unsoldmodelled
3,300
Dormant customers (34)modelled
2,000
Dead hours, Tue to Thumodelled
1,000
Monthly, modelled9,500

Illustrative fragment. Every figure in a real report is computed from your own export and carries the same modelled label.

Step 3

Approve what goes out. Nothing sends itself.

We draft the campaigns. A person approves every one before a single message leaves. Messages go from your WhatsApp to your customers, never a marketplace, never a shared list, never anyone else's customers.

Tomorrow, by the hourPredicted fillScored nightly
09:0031%
10:0055%
11:0018%
12:0040%
13:0011%
14:0036%
15:0021%
16:0049%
17:0083%
18:0091%
19:0088%
20:0064%
Only the dead band is ever offered anything. The full band runs on its own and is left alone.
The same dead window, per open hour
As it standsAED 202
With the window workedAED 266
The worked example further down the page, per open hour: the same campaign, net of the discount and net of the holdout. Arithmetic on chosen inputs, not a measured result.

Enforced in code, not policy

  • Only customers who opted in are messaged. Opt-out is immediate and permanent: a reply of STOP stops everything, including anything already queued.
  • Nothing sends outside 08:00 to 21:00, Asia/Dubai.
  • Every link is single-use and personal, so no code ends up in a WhatsApp group.
  • A customer sees offers at a capped frequency, so nobody is trained to wait for a discount.

Your customer gets a mobile page showing one business, and books in under a minute with guest checkout or a Google or Apple sign-in. Full-price links look like full-price links. A struck-through price appears only where there is a real concession.

You get a today view your front desk can pin to a phone, one-tap attendance marking, and a weekly report.

The same offers can also appear on your own booking page for people already browsing, steering which slot they take rather than whether they come. No message, no send cost.

Who it is for

One engine, because it is one problem.

  1. Salons and barbershops

    Tuesday afternoons

    As it stands

    14:00, empty

    Three weeks running, with staff already rostered

    What we do with it

    A credit toward a quiet hour, offered only to customers who are flexible about when they come.

  2. Skin and laser clinics

    Midweek mornings

    As it stands

    11:00, dead hour

    Room and clinician already paid for

    What we do with it

    The same credit, floored at your variable cost so a small discount cannot quietly lose money.

  3. Gyms and studios

    Mid-morning classes

    As it stands

    10:30, four of twenty booked

    The instructor is paid the same either way

    What we do with it

    Lapsed members invited back at your normal price. No discount involved.

  4. Physio and dental

    Monday openings

    As it stands

    10:00, no-showed

    Twice in six weeks, both never refilled

    What we do with it

    A timed confirmation before it, and the freed slot offered on at full price after it.

Every one of these sells fixed capacity that expires the moment the hour passes. The chair is paid for whether or not anyone sits in it, the hour cannot be put in a warehouse, and nobody has ever handed the owner the figure for it.

Illustrative hours, written from the mechanics. We are pre-launch and have no customer results to show.

Honest measurement

If it didn't work, your report says so.

A salon's revenue moves more month to month on weather, school holidays and Ramadan timing than any campaign will. So “revenue went up” proves nothing, and neither does a screen full of bookings that came through our link. The only way to know whether we did anything is to keep a randomly chosen group out of every campaign and compare.

Eligible customers
MessagedHeld back, sent nothing

Both groups book

Messaged

Held back, sent nothing

The difference is the only number we report

Every campaign, not a sample of them.

The same campaign, counted the usual way
Messaged
400
Booked in the two weeks after
12
Reported as recovered
12

Nothing in that number separates the customers who came because of the message from the customers who were coming anyway. Cannibalised revenue looks exactly like recovered revenue, and this is how every loyalty programme in the region overstates itself.

The same campaign, counted honestly
Messaged
400
Booked in the two weeks after
12
The held-out group's booking rate, carried across the messaged group
6

Billable6

The held-out group is half the size of the messaged one, so its booking rate is scaled up before the subtraction rather than its count being subtracted directly. Skip that step and the difference flatters us.

  1. A randomized holdout on every campaign.

    A random share of the eligible audience is deliberately not messaged. What they book anyway is what you would have got without us. That is the baseline, and it is subtracted. For offers shown on your own booking page the coin flip happens on the slot instead of the customer: a share of eligible dead-tier slots renders with no incentive at all.

  2. The headline is net, after discounts.

    Not bookings. Not gross revenue through our link. Gross, minus what would have happened anyway, minus every dirham of incentive given away. The incentive cost is printed next to it, always.

  3. Second number: revenue per open hour.

    It is the number that actually moves when we succeed, and it can't be flattered by choosing a denominator.

  4. Small samples say directional on their face.

    Under roughly ten holdout bookings an estimate is a direction, not a measurement, and the report says so on the number itself, not in a footnote.

Which means the report can come back and tell you a campaign lost money. It has to be able to. A measurement that can only return good news isn't a measurement. When it does, we stop that campaign.

A worked example

One Wednesday, both ways.

Illustrative. Not a customer result.

An aesthetics clinic, one clinician. Round numbers chosen to show the arithmetic. Yours come from your own file.

Wednesday · one clinicianAED
Without usAED 4,300
Without us · Wednesday · one clinician
10:0012:0014:0016:0018:00
10:00. Booked either way. AED 1,400.
11:00. Empty.
12:00. No-show. Lost AED 1,800.
13:00. Empty.
14:00. Cancelled, never refilled. Lost AED 1,200.
15:00. Empty.
16:00. Empty.
17:00. Booked either way. AED 700.
18:00. Booked either way. AED 2,200.
With us · Wednesday · one clinician
10:0012:0014:0016:0018:00
10:00. Booked either way. AED 1,400.
11:00. Filled with a credit. Before the credit 1,200. AED 1,080.
12:00. Filled at full price. AED 1,800.
13:00. Empty.
14:00. Filled at full price. AED 1,200.
15:00. Filled at full price. AED 1,400.
16:00. Filled with a credit. Before the credit 1,200. AED 1,080.
17:00. Booked either way. AED 700.
18:00. Booked either way. AED 2,200.
With usAED 10,860
  1. Dead hour. Skin booster, AED 120 credit.
  2. No-show on a filler, prevented.
  3. Cancelled skin booster, refilled at full price.
  4. Lapsed patient back for botox, full price.

One clinician, one Wednesday, with all four leaks in it. A real Wednesday rarely has all four.

AED 4,400
added at full price
AED 2,160
added in the two discounted hours
AED 240
given away in credits

A credit on a dead hour brings in people who would not have come at all. It also moves a few who would have come on Saturday anyway. Only the holdout tells them apart.

The same offer across a month, with the holdout subtracted.

The same offer across a month, with the holdout subtracted.

The 200 held back booked at

12 bookings from the 400 messaged, and half of them would not have booked otherwise.

Net, after every dirham of credit+AED 5,760Directional, not precise

Almost everyone would have come anyway. Nothing on the screen looked any different.

Net, after every dirham of credit−AED 240

Revenue per open hour, that window: AED 202 to AED 266.

net = bookings × ticket × (share genuinely new − discount rate)

Questions

The things owners ask first.

Will this cheapen my brand?
Your busiest hours are never discounted. Offers are small, aimed at chosen customers, and framed as a credit rather than a markdown. Your list prices stay where they are and stay visible, and three of the four leaks involve no discount at all.
Do I need new software?
No. We work from one export and WhatsApp. You don't switch booking systems, install anything, or give us a login.
How do I know it worked?
Every campaign keeps a randomly chosen group out and sends them nothing. What that group books anyway is subtracted from what the messaged group booked. The number you get is net of every dirham of discount given away, and if it is negative the report says so.
Is my customer data safe?
Only customers who opted in are messaged, opt-outs are honoured immediately and permanently, and nothing sends outside 08:00 to 21:00 Asia/Dubai. Your customers are never shared with another business. Personal data is handled under UAE PDPL.
How long does the report take?
A few days from the export. It is free, and it is yours whether or not you switch anything on.
Does AI set my prices?
No. Pricing and slot selection are plain, deterministic code, and you can read the rule: an offer only goes out where the share of genuinely new bookings can beat the discount. AI reads messy exports and drafts message copy. A person approves every campaign.