I have a confession that will make some revenue managers wince: for years I ran promo codes the way most independent hoteliers do. I made up a code, slapped it in an email, watched a few bookings come in, and told myself it worked. It “worked” the way a horoscope works. Something happened, the timing felt right, so I assumed I caused it.
Then I actually built a redemption report and looked at the numbers honestly. About half my offers were doing nothing but handing a discount to guests who were already going to book at full rate. I was paying people to do what they were already doing. That is the single most expensive mistake I see independent hotels make, and almost nobody measures it.
So this is my promo code redemption report — the actual columns I track, how I separate real new business from cannibalized business, and how I decide which offers to kill. If you run codes through your booking engine and you have never asked “did this offer create demand or just discount it?”, this one is for you.
Why most promo code tracking is theater
Here is the trap. You send a SPRING20 code. Forty bookings come in over the next two weeks with that code attached. You add up the revenue, feel great, and renew the offer next quarter.
What that math never asks is the only question that matters: how many of those forty people would have booked anyway?
If thirty of them were already planning to stay with you — they saw your Instagram, they had your tab open, they were going to hit “book” regardless — then you just gave thirty guests a 20% discount for free. The offer didn’t move them. It moved your margin, in the wrong direction.
A redemption count tells you the offer was used. It does not tell you the offer worked. Those are completely different things, and conflating them is why so many hotels run a permanent state of low-grade discounting that slowly erodes their average rate.
Redemption volume measures usage. Incrementality measures impact. An offer that gets redeemed 200 times but creates 12 net-new bookings is not a winning offer — it is a 188-deep discount on demand you already owned.
The columns in my actual redemption report
I keep this deliberately simple because a report nobody updates is worthless. Here are the fields I track per code, and why each one earns its place.
| Column | What it captures | Why it matters |
|---|---|---|
| Code + channel | One unique code per offer per channel | You cannot attribute anything if email and social share a code |
| Redemptions | Bookings that used the code | The headline number everyone already tracks |
| Room nights | Total nights on those bookings | A 4-night stay is worth more than four 1-night stays |
| Gross revenue | Revenue before the discount | Your top-line credit |
| Discount cost | Dollars actually given away | The line most reports quietly omit |
| Baseline pace | Normal booking rate for those dates/segment | The comparison that reveals cannibalization |
| Est. incremental | Bookings I believe are genuinely new | The number I actually manage to |
The first five are easy — your booking engine and PMS hand them to you. The last two are where the real work is, and where almost everyone stops. Let’s get into them.
How I estimate incremental versus cannibalized
This is the heart of it. You will never get a perfect, lab-grade number here, and anyone selling you one is lying. But you can get directionally honest, which is infinitely better than the comforting fiction of raw redemption counts.
My approach is comparison against a baseline. For any offer, I ask: what was the booking pace for these exact dates and this exact guest segment before the code went out, and during periods when no code was live?
- If I run a midweek code and midweek was already pacing at 80% of last year with no offer, most of those redemptions are cannibalized. The demand was coming anyway.
- If I run a code targeting a soft shoulder week that historically books at 40% and it jumps meaningfully, that delta is my candidate for incremental business.
The cleanest signal I ever get is a true holdout. If I send an offer to half my email list and withhold it from a matched half, the difference in bookings between the two groups is about as close to “incremental” as an independent hotel can practically measure. It is not always feasible, but when the stakes are high — a big seasonal push — it is worth the setup.
When a holdout isn’t realistic, I lean on three tells:
- Booking window. Codes that pull in last-minute bookings for dates that were not going to fill are far more likely to be incremental than codes redeemed 90 days out for a peak weekend that always sells.
- New versus repeat. A code redeemed by a first-time guest from a city you don’t usually pull from smells like new demand. The same code redeemed by your regular who stays monthly is almost certainly cannibalized.
- Rate sensitivity of the segment. Leisure travelers chasing a deal behave differently than a corporate guest on a fixed per-diem. I weight my incrementality guesses accordingly.
None of these are proof. Together they are a reasonable story, and a reasonable story beats a flattering count every single time.
A worked example (illustrative, not a real client)
Let me walk through how this changes a decision. These numbers are made up to show the method — do not treat them as a benchmark.
Say I’m looking at two offers I ran last quarter:
- WEEKEND15 — 120 redemptions, $9,000 discount given away. But weekends were already my strongest pace. My baseline says those dates would have filled to roughly 90% without any code. Estimated incremental bookings: maybe 15 of the 120. So I paid $9,000 to genuinely create about $1,100 of new business. The rest was a gift to guests already booking.
- MIDWEEK20 — 60 redemptions, $4,000 discount given away. Midweek shoulder nights historically sat half-empty. Booking pace clearly lifted above baseline while the code was live, and most redemptions were first-time guests with short booking windows. Estimated incremental: maybe 45 of the 60.
On a raw redemption report, WEEKEND15 looks like the winner — twice the redemptions, twice the revenue credit. On an incrementality basis, it’s the one I kill. MIDWEEK20, the “smaller” offer, is doing the actual job: filling rooms that would otherwise go empty.
That inversion is the whole reason this report exists. The offer that looks best is often the one quietly costing you the most.
How this ties back to your direct booking economics
Here is where promo codes connect to the bigger picture I bang on about constantly. The point of running direct offers is to shift your booking mix in a healthier direction — to win back more business you’d otherwise hand to an OTA, not to undercut your own full-rate direct demand.
OTA commissions typically run 15 to 25%. If a smart, well-targeted code converts a guest who was about to book through an OTA into a direct booking, even a 15% discount can come out ahead of the commission you’d have paid — and you keep the guest relationship, the email, the data. That is a genuinely good trade. I walk through the full arithmetic in the book-direct math piece, and it’s the lens I want you using here.
But a code that discounts a guest who was already booking direct at full rate is pure margin leakage. Same discount, opposite outcome. The redemption report is how you tell those two apart instead of averaging them into one cheerful-looking number.
The goal was never “more redemptions.” It was a healthier booking mix at a defensible average rate. A promo code that lowers your rate without changing your mix is a cost dressed up as a marketing win.
If you don’t yet have a handle on how much OTA dependence is actually costing you, that’s the prerequisite conversation. I lay out the mechanics of why guests get intercepted in how the OTAs steal your search traffic — because plugging that leak is usually worth far more than any discount you could run.
My kill-or-keep rules
Once the report is populated, the decisions get refreshingly blunt. Here’s how I triage offers each quarter.
Kill it when:
- Estimated incremental bookings are a small fraction of total redemptions and the offer targets dates that already pace strongly.
- The discount cost per incremental booking is higher than the OTA commission you’d have paid on the same booking. At that point you’d literally be better off letting the OTA have it.
- The code is being shared, reused, or screenshotted into deal forums and getting redeemed by people the offer was never meant for. Unique, segment-locked codes fix this.
Keep and scale it when:
- It demonstrably lifts pace on soft dates above your baseline.
- It pulls in first-time and net-new guests, especially ones you can then retain.
- The discount cost per incremental booking is comfortably below your blended OTA commission rate.
Investigate further when:
- The numbers are ambiguous. That’s your cue to run a proper holdout next time instead of guessing.
A quarterly cull is enough for most independents. The discipline is simply having the cull — most properties never retire an offer; they just keep stacking codes until the whole rate structure is mush.
Where promo tracking sits in a real measurement stack
Promo code redemption is one slice of a larger habit: actually measuring what your direct channel does instead of trusting vibes. It plugs into the same booking engine and analytics setup you’d use to measure conversion rate, abandonment, and channel attribution. If your booking flow itself is leaking — slow, clunky, or burying the direct offer — no amount of clever code tracking saves you. That’s the conversion-side work I cover under book-direct CRO, and it’s the natural partner to this report.
And honestly, before you obsess over squeezing another point out of a promo code, make sure the front of the funnel is healthy: that you actually rank for your own name, that you show up in local search and in AI answers, and that you’re not feeding every high-intent searcher straight to an aggregator. The discount is the last lever, not the first. Plenty of properties try to discount their way out of a visibility problem, and it never works — you can’t promo-code your way to demand that was never going to find you.
Start with one report next quarter
You don’t need software. You need one spreadsheet, a unique code per offer per channel, and the willingness to look at the cannibalization column without flinching. Run it for a single quarter and I promise at least one of your “best” offers turns out to be your most expensive one.
If you’d like help wiring up clean tracking — unique codes, baseline pace, the incrementality logic, and the booking-engine plumbing behind it — that’s exactly the kind of work I do. Take a look at book-direct CRO to see how I approach the direct-channel economics, then book a call and we’ll pull apart your current offers together. I’d rather help you kill three lazy discounts than watch you renew them for another year.