> For the complete documentation index, see [llms.txt](https://revhero.gitbook.io/revhero-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://revhero.gitbook.io/revhero-docs/setting-your-rates/offers/stacking-methods.md).

# How offers stack

Discount-only and markup-first stacking, what each one does to a rate, and why the choice is worth checking.

Every offer group carries a **stacking method**. It decides the order in which a markup and the discounts apply to your send rate. It therefore decides what the guest pays at each level of the stack, and what you keep at the end, as simulated on the [Yielding Board](/revhero-docs/setting-your-rates/yielding-board.md).

Two methods exist because two channel models exist in the real world: one where the rate you publish is the rate the channel sells and discounts come off it, and one where the partner is allowed to mark your rate up before discounting against their own selling price.

{% hint style="info" %}
Choosing the wrong method does not break anything and nothing warns you. It quietly produces a result several percent away from reality. Open each group and confirm its stacking method before you rely on the simulation for a pricing or contract decision.
{% endhint %}

![The same €200 through discount-only and through markup-first](https://272652298-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnzEa7YGji6t92Mfc0ZJ1%2Fuploads%2Fgit-blob-10606216285fa16039c42585f55b3398b0912d27%2Fdiscount-only-against-markup-first.svg?alt=media)

*The same €200 send rate keeps €137.70 under discount-only and €171.60 under markup-first — €33.90 apart.*

## Discount-only

The discounts come straight off your send rate, one after another, and commission comes off what is left. This is the shape of most online travel channels: the rate they show is the rate you set, they apply their own tiered discounts on top, and they pay you the remainder less their commission.

On a €200 send rate, with a 10% loyalty discount, a 10% mobile discount and 15% commission:

| Step                           | Rate    |
| ------------------------------ | ------- |
| Your send rate                 | €200.00 |
| After the 10% loyalty discount | €180.00 |
| After the 10% mobile discount  | €162.00 |
| After 15% commission           | €137.70 |

**What you keep: €137.70** — a 31% gap to the headline rate, from a stack that reads as "10 plus 10 plus 15".

That compounding is the point. Two 10% discounts do not remove 20%; they remove 19%, because the second applies to what the first left. The commission then applies to the discounted amount, not to your published rate.

## Markup-first

Your send rate is marked up first, and the discounts apply to the marked-up amount. This is the shape of wholesale and tour-operator contracts: you grant a discount off your published rate, but the partner is permitted to mark the rate up to their own customers — so the effective discount against what they actually sell is smaller than the headline number suggests.

On the same €200 send rate, with a 10% markup and a 22% contracted discount and no commission:

| Step                   | Rate    |
| ---------------------- | ------- |
| Your send rate         | €200.00 |
| After the 10% markup   | €220.00 |
| After the 22% discount | €171.60 |

**What you keep: €171.60** — a 14% gap to the headline.

Compare that with the same 22% discount taken straight off €200, which leaves €156. The markup raises the base the discount lands on, so a markup-first group nets more than a discount-only group carrying the same headline discount whenever a markup is applied. At a markup of zero the two methods produce the same number.

## Choosing the method

Read the contract rather than guessing from the channel's name.

| The contract reads…                                          | The shape it describes                                   |
| ------------------------------------------------------------ | -------------------------------------------------------- |
| *"published rate, less X%"* with a commission                | Discounts come off your rate — discount-only             |
| *"net rate"*, with the partner free to set the selling price | The partner re-prices before selling — markup-first      |
| *"X% off published, partner may mark up by Y%"*              | Markup-first, with both numbers entered                  |
| A direct channel you control, with no commission             | Discount-only, modelling any promotions you run yourself |

If a partner genuinely does both, model them as two groups rather than trying to express it in one. That keeps each result explainable.

## Keeping groups honest over time

| What changed                                                | What to update                                   |
| ----------------------------------------------------------- | ------------------------------------------------ |
| A new commission rate                                       | The Commission % field                           |
| A loyalty or member tier moved                              | That discount's value in the Offers list         |
| A contract markup increased                                 | The Markup % field on that group                 |
| A partner moved from a net-rate model to a commission model | The stacking method, and the commission to match |
| A new channel-side discount appeared                        | A new row in the Offers list                     |

When you want to see the absolute floor, build a separate worst-case group for the channel: every published discount applied at once, and the highest commission the contract allows. Turn it on to read the worst case, off to return to your baseline.

## When the numbers look wrong

| What you see                                               | Usually because                                                    | What to do                                                            |
| ---------------------------------------------------------- | ------------------------------------------------------------------ | --------------------------------------------------------------------- |
| The markup field is not available                          | The group is not set to markup-first                               | Change the stacking method and the field appears                      |
| A markup-first group nets the same as discount-only        | The markup is zero or blank, which makes them identical            | Confirm the contract markup                                           |
| What you keep looks too low for an online channel          | Every discount is stacked, when some are mutually exclusive        | Check which discounts genuinely combine on one booking                |
| What you keep does not match your channel manager's figure | A missing discount, a stale commission, or tax treated differently | Check the contract — the simulation reflects exactly what you entered |
| A wholesale group still reads low on markup-first          | A commission is still set, which wholesale rarely carries          | Clear the Commission field and save                                   |

## Common questions

**Does the order of the discount rows matter?** No. The result is the same whatever order they sit in. Order them the way the channel applies them, so the stack is readable.

**Can I switch a saved group's method without losing anything?** Yes. Change the method, fill in the markup if the group now needs one, and save. Your discount list and commission are preserved.

## Related

* [Offers](/revhero-docs/setting-your-rates/offers.md)
* [Offer groups](/revhero-docs/setting-your-rates/offers/offer-groups.md)
* [Offers on the Yielding Board](/revhero-docs/setting-your-rates/offers/yielding-board-integration.md)
* [Pricing](/revhero-docs/setting-your-rates/pricing.md)

***

**Was this page helpful?** If something here is wrong, unclear or missing, email [support@revhero.com](mailto:support@revhero.com?subject=Manual%20feedback%20%5Ben%5D%20offers%2Fstacking-methods.md) and quote this page: `offers/stacking-methods.md`. Say what you expected to find — that is the part we can fix.
