AURA

Winning Guests Back: Measure Contribution, Not Messages

A base of 14 000 guests earns nothing until a campaign can be taken down to contribution. Here are 183 lapsed guests split into four segments — one of which receives nothing at all — and the arithmetic that runs from 71 conversations to 27 visits, 8 460 PLN of revenue and 3 900 PLN of contribution, every formula with its reverse check.

Published
25 min read5031 words
Aura editorialAuthor

Key takeaways

  • "183 messages sent" counts our own effort. The campaign is measured at 71 conversations, 34 bookings, 27 visits, 8 460 PLN of revenue and 3 900 PLN of estimated additional contribution.
  • Lapsed is read against the guest’s own interval: 45 days of silence is 1.5 cycles for a monthly guest and 6.43 for a weekly one, so one fixed window is 4.29 times harsher on the second.
  • The 183 split into four segments, and the fourth receives nothing. The do-not-send filter runs before segmentation, on five tests, and consent is the first of them.
  • The funnel closes from both ends: 38.80 % × 47.89 % × 79.41 % = 14.75 %, which is 27 / 183 arrived at the other way.
  • Contribution, not revenue: 3 900 + 1 120 = 5 020 PLN, or 59.34 % of the 8 460 PLN — and the order in which those lines were calculated moves the answer by exactly 1 120 PLN.
  • Payback is counted in visits, never in months: 1 120 / 185.93 = 6.02 visits, about 41 of the 183 addressees.
  • One message pays above a 3.29 % chance of an incremental visit. Our segment ran at 14.75 %, and that rate does not transfer to the rest of the base.

A guest database earns nothing until you can say what a campaign added to contribution. Split the guests who stopped coming by the reason they stopped, send to the segments a message can actually move, send nothing to the rest, and take the result down through bookings and visits to the money left after variable cost.

Why "183 messages sent" is not a result

Our database holds 14 000 guests. Most restaurants own a list that size and never earn a zloty from it, and the reason is rarely laziness. It is that nobody can say what the list is worth, so nobody can justify the work of using it well — and the one action that needs no justification is sending everyone the same thing.

A week after the reactivation campaign, the line most reporting tools would have shown is sent, 183 messages. True, and worth nothing. It counts our own effort: it moves when we press a button and not when a guest walks through the door, the exact opposite of what a business number should do. Opens, clicks, "reach" and followers share the defect — all counts of activity on our side of the glass.

Here is the line we actually work from:

Reactivation campaignNumber
Guests contacted183
Conversations opened71
Bookings created34
Visits that happened27
Revenue8 460 PLN
Variable cost of campaign and incentives1 120 PLN
Estimated additional contribution3 900 PLN

These are our numbers, from a restaurant turning over about 500 000 PLN a month with 25–30 people on the payroll. Nothing below is a projection; everything below is that campaign taken apart so you can run the same arithmetic on your own list.

"183 sent" cannot be wrong, so it cannot teach anything. The table can be wrong in seven places, and each is a decision. A number that cannot fail is not a measurement.

Reactivation campaign — messages sent to guests who used to come and stopped, aimed at producing a booking that would not otherwise have happened.

Through-rate — the share of contacted guests who ended up walking in. The only conversion figure here that spans the whole campaign; the others measure one step each.

What "lapsed" means: the guest's own rhythm, not the calendar

The 183 were not picked by browsing the list. They are guests who used to come at least once a month and have not appeared for 45 days or more. Two conditions, and the second only means something because of the first.

Take the second alone and it is a calendar rule: everyone silent for 45 days. That sweeps in a guest who comes twice a year and is exactly on schedule, and equally a guest who came every Friday and has missed six visits in a row. One is fine. The other is gone, and was gone weeks ago. So the window has to be read against the guest's own interval.

Silence multiple = Days since the last visit / The guest's own visit interval

  • Days since the last visit — days, from the last recorded visit to today;
  • The guest's own visit interval — days, the typical gap between that guest's visits, from their own history;
  • result — dimensionless: how many of that guest's own cycles have been missed.

Worked, both ways. For a monthly guest the interval is 30 days, so 45 / 30 = 1.5 cycles: one missed visit and a half. Reverse: 30 × 1.5 = 45 days, where we started. For the guest who came every Friday the interval is 7 days, and the same 45 days is 45 / 7 = 6.43 cycles. Reverse: 7 × 6.43 = 45. One fixed window is 4.29 times harsher on the weekly guest than on the monthly one — and 30 / 7 = 4.29 is that ratio arrived at from the intervals alone, which is the check that the first two numbers were divided correctly.

Ours was set at "used to come monthly, silent 45+ days": a group large enough to work with and recent enough to still remember us. It is our threshold, not a standard. We looked for a published one; there is none.

Lapsed guest — a guest whose silence multiple has passed the threshold you set for your own room. Not "has not come for N days", because N alone describes the calendar, not the guest.

How you build that history, and what to do when most guests are anonymous, belongs to guest retention and repeat rate. What a returning guest is worth over the whole relationship is guest lifetime value. This page starts after both: the segment exists, and the question is what to send it.

Four segments, and the fourth one gets nothing

The 183 did not receive one message. They received three different ones, and a quarter of them received none at all.

SegmentBuilt fromGetsCosts to get wrong
The menu changed since they last cameLast visit date against the dates the card changedThe specific change, not "we have a new menu"A message about a dish they already ate
They have a dish they always orderedItem-level history, not the bill totalThat dish, by name, and whether it is still onA favourite that was delisted; reads as a joke
They came in the evening and stoppedVisit times against the current patternAn occasion in the evening, when their table is freeAn invitation to an hour with no table left
Better off left aloneConsent, complaints, cycle length, discount historyNothingA visit that would have happened anyway, bought at a discount — or a complaint

The message is only as good as the fact behind it. The favourite-dish segment needs item-level history, a different kind of record from a bill total and also what menu engineering runs on; the evening segment needs the hour a guest used to arrive and whether that hour is currently free, which is a reservation question before it is a marketing one.

Notice what all three share: each is a reason to come back that exists independently of a discount. A discount works on every segment, which is why it is the default, and it lowers the contribution of the visit it produces. What it has to earn back in extra covers is the discount break-even. Reach for it last.

Segment — a group that gets a different message because a different fact is true about them. If two groups get the same message, they are one segment with extra paperwork.

How the do-not-send list is built, and why it runs first

The fourth segment deserves the most attention, because it is the one nobody builds. It is also not really a segment: it is a filter that runs before the other three, and everything it removes is removed for a reason that has nothing to do with what we would like to say.

Five tests, in this order. Each is a reason to send nothing.

1. No consent, or consent withdrawn. Not a judgement call and not a marketing decision. It runs first because it can void everything after it, and because the mark has to survive every export, merge and re-import of the list — a "do not contact" flag lost when the file moves is worse than never having collected it.

2. The guest is not lapsed, their cycle is just longer than the window. A guest whose own interval is 60 days, silent for 45, is not gone. They are early. A message here does not produce a visit; it produces the visit that was already coming, at whatever discount was attached — the most expensive kind of message, and one the campaign report will happily count as a win.

3. They stopped for a reason a message does not fix. An unresolved complaint, a bad last visit, a dispute over a bill. What is owed there is a person and an apology, and an offer instead reads as though nobody read the complaint. The route from a complaint to the cause behind it is from a complaint to the root cause.

4. They only ever respond to a discount. Visible in the history: every visit preceded by an offer, none without one. The relationship is real, but it is with the offer, each new visit needs a bigger one, and contribution falls at each turn. Whether the group earns its keep is the arithmetic of marketing return measured on margin.

5. Channel fatigue. Contacted several times recently with nothing to show for it. The next message costs goodwill and risks a complaint, and a complaint costs the deliverability of every message after it, to everyone.

Do-not-send list — the guests removed before segmentation begins, each with the test that removed them recorded next to them. A list with reasons, not a mood.

The five tests decide qualitatively. One formula decides the same question quantitatively:

Send threshold = Cost per addressee / Contribution per visit

  • Cost per addressee — PLN per person, here 6.12;
  • Contribution per visit — PLN per visit, here 185.93;
  • result — the probability of producing one additional visit at which the message breaks even, dimensionless.
3.29%
6.12 / 185.93 = 3.29 %. Reverse: 3.29 % × 185.93 = 6.12 PLN.

Below that probability, writing to a person destroys value; above it, the message pays.

14.75%
Our segment came in at 14.75 %, which is 4.48 times the threshold.

Reverse: 3.29 % × 4.48 = 14.75 %. Both inputs are worked out further down; what matters here is that the probability in the numerator is incremental — the chance of a visit that would not otherwise have happened.

3.29%
A guest who was coming anyway contributes zero to it however promptly they book, which is why a threshold as low as 3.29 % is not permission to write to everyone.

Consent is a gate, not a variable. Sending commercial messages by electronic means is not ours to decide. In Poland the rule sits in the law on electronic communications — Prawo komunikacji elektronicznej, consolidated text, Dz.U. 2024 poz. 1221, read for this page on 28 August 2026. It prohibits using automated calling systems and telecommunications terminal equipment to send commercial information, including direct marketing, to a subscriber or end user unless that person has given prior consent. That is a translation, not a quotation; the Polish text is in the act itself. Two things follow: the addressable base is the consented base, and it is smaller than the list; and the personal-data side sits on top of that — the purpose the data was collected for, the guest's ability to object, and the obligation to keep the objection. Where guest data lives once systems start talking to each other is automation and data protection.

This page names no article numbers of the data protection regulation. We did not measure them, and a confident wrong reference is worse than none: it is the kind of thing a reader repeats.

Why one blast to the whole base is cheaper to run and dearer to live with

Sending one message to 14 000 addresses takes about as much work as sending one to 183. That is the whole appeal, and it is not an illusion: it is the segmenting that costs, not the sending. The bill arrives on the other side, in four places, and none of them appears in a campaign report.

You buy visits you already had. Every guest who was going to come anyway and receives an offer now comes with the offer applied. The revenue looks the same; the contribution is lower by the value of the incentive, times everyone in that position. This cost grows with the size of the send and has no line of its own.

You spend the list itself. A guest database is a stock, not a flow. Each untargeted send converts a slice of it into unsubscribes, complaints and silent readers who have learned that our messages are not for them. That stock took years to accumulate and does not refill on demand.

You lose the ability to measure anything. When everyone gets a message, there is nobody left who did not, and "would they have come anyway" has no source of an answer. And consent risk scales with addresses, not with results: the guests who respond do not reduce the exposure created by the thousands who did not consent.

Campaign cost rises with the number of addressees; contribution rises only with the number who actually came back and would not have otherwise. A blast maximises the first while doing nothing for the second.

14.75%
Which is why this calculation, tempting as it is, is wrong: our campaign put 14.75 % of contacted guests through the door, so the base of 14 000 should be worth 14 000 × 14.75 % = 2 066 visits.
14.75%
It is not. The 14.75 % was measured on 183 guests selected for a recent habit and a fresh reason to return.

The other thirteen-and-a-half thousand were selected for nothing: guests who came once four years ago, guests who moved away, guests with no consent, guests on the do-not-send list. A rate measured on the best segment says nothing about the population it was picked from. What transfers is the method — measure your own segment, get your own rate.

The funnel of the campaign, step by step

StageCountFrom previous stageOf all 183
Contacted183—100 %
Conversation opened7138.80 %38.80 %
Booking created3447.89 %18.58 %
Visit happened2779.41 %14.75 %
38.80%
Read the third column first: 38.80 % of the people we wrote to answered — high, and high because they were chosen.
47.89%
Of those, 47.89 % went as far as a booking.

Of the bookings, 79.41 % turned up.

38.80%
The reverse check: multiply the three step conversions, 38.80 % × 47.89 % × 79.41 % = 14.75 %, which is 27 / 183 arrived at from the other end.
14.75%
And forward again: 183 × 14.75 % = 27 visits.

The chain closes, so no stage is counted twice or skipped.

The remainders matter as much as the conversions, because each is a different failure with a different fix: 112 never answered (wrong list, message or channel), 37 talked and did not book (no table at the hour they wanted, or a question nobody answered), 7 booked and did not come. Those add up: 112 + 37 + 7 + 27 = 183.

Where the conversation gets answered without a person on our side, and where it must not be, is guest messages and automatic bookings; not losing an incoming thread is one queue for every enquiry and the follow-up that carries it.

From revenue to contribution: where the 3 900 PLN comes from

The 27 visits produced 8 460 PLN of revenue. That is the number everybody quotes and the one nobody should stop at, because a restaurant does not keep revenue.

Contribution margin — the money left from net sales after variable costs, available to cover fixed costs and, once they are covered, to become profit. The full account of it, and of the break-even it feeds, is the break-even point; this page only uses it.

Two variable costs come off the 8 460 PLN: what the guests ate and drank plus everything else that moves with a cover, and the campaign itself, 1 120 PLN of messaging and incentives. What is left is 3 900 PLN of estimated additional contribution.

Campaign contribution = Contribution on the incremental revenue - Campaign variable cost

  • Contribution on the incremental revenue — PLN, the revenue of the visits the campaign produced, less the variable cost of serving them;
  • Campaign variable cost — PLN, messaging plus incentives, here 1 120;
  • result — PLN, the money the campaign left behind.

Rearranged, that formula tells you something the report does not print.

59.34%
If 3 900 PLN is what remains after the 1 120 PLN, the contribution earned on the food and drink was 3 900 + 1 120 = 5 020 PLN, which is 5 020 / 8 460 = 59.34 % of the revenue.
59.34%
Reverse: 8 460 × 59.34 % − 1 120 = 3 900.
40.66%
The chain closes, and the implied share is plausible — the variable cost of serving those covers ran at about 40.66 % of their revenue.

⚠️ That is a reading, and it deserves to be named as one. The report gives three lines; it does not say in which order the third was calculated. We read 3 900 PLN as net of the 1 120 PLN, because that is the reading whose implied margin makes sense.

46.10%
Read the other way — 3 900 PLN before campaign cost — the campaign left 3 900 − 1 120 = 2 780 PLN and the implied margin on the food would be 46.10 %.

The two readings differ by exactly 1 120 PLN, the difference between a good campaign and a decent one. Decide the order before you calculate, and write it next to the number.

Never add lines of different kinds. Revenue, contribution and saved cost are three different things, and a total that mixes them is a number with no unit at all.

What the campaign cost, and how many visits paid for it

Divided byResultThe question it answers
183 addressees6.12 PLNWhat one message cost us
34 bookings32.94 PLNWhat one booking cost us
27 visits41.48 PLNWhat one guest through the door cost us

Reverse check on the first: 183 × 6.12 = 1 120 PLN. The three are the same money cut three ways, not three separate costs, and adding them would be meaningless.

⚠️ 6.12 PLN per addressee is an average, not a marginal cost. The messaging part is nearly free per extra name; the incentive part is only spent on people who respond. Add one addressee and you add a fraction of a zloty. Use the average for comparing campaigns, the marginal cost for deciding whether to add a name — confusing the two is what makes a big send look cheap.

Now the payback, in visits rather than in weeks. A restaurant has no monthly recurring anything; expressing the return in time would require assumptions about a future we did not measure.

Break-even visits = Campaign variable cost / Contribution per visit

  • Campaign variable cost — PLN, here 1 120;
  • Contribution per visit — PLN per visit, the contribution on one returning visit before campaign cost: 5 020 / 27 = 185.93;
  • result — visits.

1 120 / 185.93 = 6.02 visits. Reverse: 6.02 × 185.93 = 1 120 PLN. The campaign paid for itself somewhere in the sixth returning guest, and the remaining 21 visits produced the 3 900 PLN: (27 − 6.02) × 185.93 = 3 900 PLN, which closes on the reported figure from a different direction.

79.41%
Two more forms of the same threshold, the ones you can act on before the campaign runs: 6.02 visits at the observed 79.41 % show-up rate is 7.59 bookings, and 7.59 bookings at the observed 14.75 % through-rate is 40.83 addressees.
14.75%
Of 183 people contacted, the first 41 covered the entire cost of writing to all of them. Reverse: 40.83 × 14.75 % = 6.02 visits.

Compare that against customer acquisition cost — what a brand-new guest costs. The two are rarely close, and knowing both makes the choice between the budgets a decision instead of a habit.

The seven bookings that never became visits

34 bookings, 27 visits.

20.59%
Seven did not turn into anyone sitting down: 20.59 % of them.

Those seven had already cost us everything a booking costs — the message, the conversation, the reply, the table held. What they did not do is arrive.

Contribution lost to unhonoured bookings = Bookings not honoured × Contribution per visit

  • Bookings not honoured — bookings, here 7;
  • Contribution per visit — PLN per visit, 185.93;
  • result — PLN of contribution arranged and not collected.

7 × 185.93 = 1 301.48 PLN, against 7 × 313.33 = 2 193.33 PLN of revenue at the campaign's average spend per visit of 8 460 / 27 = 313.33 PLN. Reverse: 1 301.48 / 7 = 185.93 PLN. Put next to the campaign's entire cost of 1 120 PLN, the seven missing guests were worth 1.16 times the whole campaign in contribution. Reverse: 1 301.48 / 1 120 = 1.16. So the obvious improvement — write to more people — is not the best one available: the confirmation chain on bookings we already have is worth more per unit of effort, and it applies to every booking the restaurant takes. That chain is the no-show confirmation chain.

A cross-check on the 313.33 PLN, from a different day and a different report. That day the restaurant did 21 480 PLN across 126 guests, an average of 170.48 PLN per guest — and that report's own line for average check reads 170 PLN, so the division is being done on the right two numbers. At that spend, a returning visit of 313.33 PLN is 313.33 / 170.48 = 1.84 guests. Reverse: 1.84 × 170.48 = 313.33 PLN. The campaign brought back tables of roughly two: had the arithmetic implied 0.4 or 9 guests per visit, something upstream would be wrong. It assumes comparable spend per guest across the two periods, so it is a plausibility test, not a measurement.

What this arithmetic does not prove

Everything above measures what happened. Almost none of it measures what the campaign caused, and the difference is the commonest way a reactivation report flatters itself. We can say that 27 contacted guests visited within the window, that the campaign cost 1 120 PLN and that 3 900 PLN of contribution is attributable to it as reported.

14.75%
We cannot say from these numbers that all 27 came because of the message, that repeating the campaign monthly produces 3 900 PLN a month, or that the rest of the base would convert at anything like 14.75 %.

The missing instrument is a control group: a randomly chosen slice of the same segment deliberately sent nothing, so the visits they make anyway can be subtracted from the visits the contacted group makes. Without it, the campaign is credited with every guest who would have drifted back on their own. With it, the number gets smaller and becomes true. How to hold one out without wrecking the campaign is did the promotion work, or did the week. The word "estimated" in front of "additional contribution" is doing exactly this work, and it should stay there.

Second, this is one campaign, not a monthly rate. The guest-return line runs at about +15 000 PLN of revenue a month, which is 15 000 / 8 460 = 1.77 campaigns of this size — and that line is revenue, sitting beside lines of profit and lines of avoided cost that must not be added to it.

46.10%
Carrying the campaign's own contribution share across, 15 000 × 46.10 % = 6 915 PLN, is arithmetic, not a forecast: it assumes the same margin and mix.
9.75%
Against monthly operating profit of 40 000 to 50 000 PLN, one campaign's 3 900 PLN is between 9.75 % and 7.80 % — material, and nowhere near a business model on its own.

And none of this survives a bad list: every figure here rests on knowing who a guest is, when they last came and what they ordered.

Where the system works and where it is plain arithmetic

Plain arithmetic, and you can do all of it in a notebook: every formula on this page — the silence multiple, the funnel conversions, the cost per addressee, the break-even in visits, the send threshold, the contribution of the no-shows. On 183 guests it is an afternoon with a spreadsheet; the arithmetic does not get harder with more guests, only longer.

Sorting, which is where the volume lives. Ranking 14 000 guests by silence multiple, matching item-level history against the current card, checking each addressee against consent, complaints and recent contacts. Doing it once is possible; doing it every week is not, and once a week is what a rhythm requires. That is what a guest database that keeps its own history and its analytics are for.

Conversation, which is where the judgement lives. Answering 71 people, holding the thread and turning an answer into a booking is real work with real edges. What can be handled without a person, and where the handover happens, is a boundary drawn deliberately — the follow-up lives in automatic follow-up, the outbound messages in message automation, the channels the guest uses in messengers.

The choice, which stays with the owner. What to offer, whom not to write to, how big an incentive is acceptable, whether the do-not-send list is respected when a quiet week arrives. A system can put a prepared option on the table with the price of each variant attached — that is a decision engine — but the decision is not a calculation. And what the owner should see afterwards is the funnel and the contribution, not the send count: which numbers earn that screen is reporting: the numbers an owner really looks at, and how the surrounding routine fits together is restaurant automation.

One honest limit: none of this makes a guest want to come back. It finds the ones who might, stops us bothering the ones who should not be bothered, and counts what happened in money instead of in messages. The reason to come back is still the food, the room and the people — and how much of that money stays is restaurant profit margin. Whether a returning guest's dish still earns what it used to is a dish that sells while earning less, and which guests are worth grouping is RFM segmentation.

Frequently asked questions

How do I measure whether a guest reactivation campaign worked?

Take it down to contribution, not to messages sent or opened. Count the guests contacted, the conversations opened, the bookings created and the visits that happened, then subtract the variable cost of serving those visits and the cost of the campaign. Ours went 183 contacted, 71 conversations, 34 bookings, 27 visits, 8 460 PLN of revenue, 1 120 PLN of cost, 3 900 PLN of estimated additional contribution.

After how many days is a guest considered lapsed?

There is no published standard, and one number for the whole base is the wrong shape of answer. Compare the silence to the guest's own interval: 45 days is 1.5 cycles for someone who came monthly and 6.43 cycles for someone who came every Friday. We use "came at least monthly, silent 45 days or more", which produced our segment of 183 out of 14 000. Set your own threshold and write down why.

Why not send the offer to the whole database?

Because it is cheaper to run and more expensive to live with. You buy visits that were coming anyway at a discount, you spend a list that took years to build on unsubscribes and complaints, you lose any ability to tell whether the campaign caused anything, and consent exposure grows with addresses rather than with results. Our 14.75 % through-rate came from a selected segment and does not transfer to the rest of the base.

How do I decide whom to send nothing to?

Five tests, in order. No consent or consent withdrawn. Their natural cycle is longer than your silence window, so they are early rather than gone. They stopped for a reason a message cannot fix, such as an unresolved complaint. They respond only to discounts, so each visit costs more contribution than the last. They have been contacted several times recently with no result. Keep the list with the reason next to each name.

What did one returned guest cost, and when did the campaign pay for itself?

Divide the campaign cost three ways and each answers a different question: 1 120 / 183 = 6.12 PLN per message, 1 120 / 34 = 32.94 PLN per booking, 1 120 / 27 = 41.48 PLN per guest through the door. Payback is counted in visits, not weeks: 1 120 / 185.93 = 6.02 visits, about 7.59 bookings or 41 addressees at our conversion rates. Of 183 people contacted, the first 41 covered the cost of writing to all of them.

Does this prove the campaign caused those visits?

No, and no arithmetic on the contacted group alone can. Some of those 27 guests would have drifted back without a message, and they are currently credited to the campaign. The only fix is a control group: hold back a random slice of the same segment, send them nothing, and subtract the visits they make anyway. Expect the honest number to be smaller.

Take the guests who used to come at least once a month and have now been silent for more than one and a half of their own cycles, and before writing a single message, mark the ones you should not write to at all. That list is usually shorter than the fear of it and longer than the hope. The rest of the series is collected in the restaurant hub.

Related services

In this section

Let us look at your numbers

Tell us how enquiries are handled today — how many there are, who picks them up, where they get lost. Aura walks the process with you and shows what can be taken off a person, and what is better left alone.

Talk to Aura

The home page with Aura opens. Give a company name — she looks at it in public data and shows what a client sees. No promises of a result.

Prefer to write? marketing@auraglobal-merchants.com

Next step

Let us check whether Aura fits your place

We do not take everyone: first we look at your processes, sales and current systems and tell you honestly whether it makes sense for us to come in. A few questions, about five minutes.

Take the assessment →