Pricing is where B2B travel businesses quietly lose money. Not through bad contracts — through arithmetic that lives in three places, disagrees with itself, and only gets checked when somebody complains.

This is the vocabulary, and the small number of rules that keep it honest.

The words, used precisely

Net rate — what you pay the supplier. Your cost. It should appear in your system next to the price you sell at, and nowhere near your agents.

Sell rate — what a specific agent pays you.

Markup — the difference, expressed either as a percentage of the net rate or as a fixed amount per booking, per person or per night. Which of those it is matters enormously and is the most common place a system is vague.

Commission — the same money viewed from the other end: a discount off a published rate. B2C-flavoured, and it causes confusion in a net-rate business because "10% commission" and "10% markup" are not the same number.

Gross / rack — the published consumer price. Useful as a reference point for what an agent can resell at; dangerous if it leaks into your own maths.

If your team uses "commission" and "markup" interchangeably, fix that before you fix anything else. They differ by a few percent, and a few percent is the business.

Rule one: cost and price live in the same place

The single highest-value change most operators can make is putting the contracted cost next to the sell price on the same screen, at the same level of detail.

Not in a separate spreadsheet. Not in the contract PDF. On the row where somebody types the price.

The reason is not reporting. It is that a person typing a price with the cost visible does not type a losing price, and a person typing a price without it does — perhaps twice a year, on a season nobody was paying attention to.

Once cost sits next to price, margin is derivable everywhere for free: per room, per option, per route, per booking, per agent, per month.

Rule two: one price per agent, derived not typed

The moment you have more than one price level, you have a choice.

The bad way: a second rate sheet for tier B agents. Then a third for tier C. Now every rate change is three edits, and eventually it is two edits and a mistake.

The good way: one set of rates, plus a rule per agent or per tier that adjusts it. The agent's price is calculated. Changing a rate changes it for everybody, correctly, at once.

This holds even when the tiers are commercially complicated. "Tier A gets 3% off, except on the Bali contracts, where they get 5%" is a rule. It is not a second rate sheet.

Rule three: the most specific rule wins, and only one wins

Once you have rules at more than one level — a default, a per-module rule, a per-agent rule — you need one unambiguous answer to "which applies?"

The rule that works: the most specific rule that matches wins, and the rest do not apply. Not the sum of them. Not the highest. One.

Stacking is where inexplicable prices come from. If an agent-level rule and a module-level rule both add 5%, and the system applies both, somebody has been sold at 10% over and nobody can say why. Pick specificity, document it in one sentence, and never make an exception.

Rule four: markup applies to what you resell, not to what you own

This one is specific to operators who do both.

If you are reselling somebody else's supply — a bedbank, a wholesaler's API — markup is exactly the right mechanism. Their price comes in, your margin goes on, the agent sees the result.

If it is your own contracted inventory, the price you typed is the price. Layering a markup engine on top of your own rates means the number on your rate screen is not the number your agent pays, and you now have two prices for one product and no way to say which is real.

Keep the distinction sharp: own inventory is priced, third-party supply is marked up.

Rule five: round once, at the end, in the agent's currency

Currency and rounding cause more support tickets than any pricing rule.

  • Hold money as integer minor units — 1250 cents, never 12.50 as a floating-point number. Money in decimals accumulates errors that show up as one-cent mismatches in reconciliation.
  • Apply the exchange rate at a recorded moment, and store which rate you used. "The rate at the time" is not auditable unless the rate is written down with the booking.
  • Round once, at the end of the calculation, not at each step. Rounding per night and then summing gives a different total from summing and rounding, and your agent will find the difference.
  • Show the agent one currency, always — the one their agency trades in. A B2B buyer comparing your price to a competitor's should never have to do the conversion themselves.

Designing tiers people will actually manage

A last, practical note. Tiers are a commercial instrument, not a data model, and they degrade if there are too many.

Three works: your volume partners, your regulars, and everyone new. Some operators add a fourth for a specific market. Beyond that, nobody can remember who is in which tier, exceptions creep in, and you are back to rate sheets.

Two questions worth answering before you create a tier:

  1. What does an agent do to move up? If the answer is not a number, it is not a tier — it is a favour, and it should be an exception on that one agent, not a level.
  2. What happens when they stop? Tiers that only ratchet upward become a discount you can never withdraw.

The report that tells you whether any of this worked

One report, run monthly: margin by agent, and margin by product, both on the same page.

It answers the two questions that decide the year. Which agents are worth the discount they are getting? And which products are you selling a lot of at a margin that does not survive the cost of selling them?

Most operators can guess the first list. Almost nobody guesses the second one right.