Мультивалютный сайт бронирования: где утекает маржа

Субагент из Алматы спрашивает, почему на странице поиска был KZT, а в счёте стоит USD. Вы проверяете — обе цифры верны. Поставщик назначил цену в одной валюте, путешественнику показали вторую, а списание по карте прошло в третьей. Никто не ошибся, а денег всё равно не хватает. Именно здесь сайт бронирования путешествий с мультивалютностью тихо теряет маржу, и виноват почти никогда не курс. Виновато правило округления под ним и вопрос, на который никто не ответил: кто несёт валютный риск между показом цены и расчётом.
Две валюты, и деньги двигаются только в одной
Любой магазин, продающий через границу, одновременно ведёт две валютные системы. Считать их одной — источник большей части беспорядка.
Валюта отображения — то, что читает путешественник. Это слой представления. На этой платформе каждый white-label-сайт выбирает свою валюту по умолчанию и список, который предлагает, а цены конвертируются на стороне клиента по таблице курсов, своей у каждого арендатора. Деталь важнее, чем кажется: число на экране производное. Это ваш курс, применённый к цене поставщика в момент отрисовки страницы, а не цена, которую кто-то обязался держать.
Валюта расчёта — та, в которой деньги действительно двигаются: в ней поставщик выставляет вам счёт, платёжный шлюз списывает, банк показывает выписку и уходит возврат. Обычно одна на поставщика и одна на шлюз, и это не всегда одна и та же.
Когда агентство говорит «мы продаём в KZT, RUB и USD», почти всегда это значит: показываем три, рассчитываемся в одной. Так вести дело совершенно нормально, так работает большинство. Нормально ровно до момента, когда что-то дальше по цепочке принимает показанную цену за обязательство — возврат, выписка субагенту, спор по карте, — потому что показанная цена обязательством никогда не была. Она была отрисовкой.
Кто несёт валютный риск
Между тем, как путешественник увидел цену, и тем, как деньги дошли, кто-то открыт курсу, который может сдвинуться. Вопрос не в том, есть ли эта позиция, а в том, чья она и знает ли он об этом.
Честных ответов три. Её несёт поставщик, если вы законтрактовали нетто-тарифы (Net Rates) в своей валюте и конвертацию он берёт на себя. Её несёт путешественник, если вы списываете в валюте поставщика, а конвертирует банк-эмитент его карты — для вас самый чистый вариант и тот, на который жалуются чаще всего, потому что сумма в выписке не равна сумме в подтверждении. Либо её несёте вы, и таблица курсов означает ровно это: вы зафиксировали курс, а разница с реальным курсом в день расчёта ваша — в обе стороны.
Все три защитимы. Избегать нужно случайного четвёртого варианта: никто ничего не решил, таблица обновляется, когда вспомнят, а позиция обнаруживается при сверке кварталом позже. Если вы не можете назвать ответственного и периодичность обновления одной фразой — вы в четвёртом.
Округление — решение о цене, а не о форматировании
Большинство движков по умолчанию берут шаг округления 0,01, потому что так выглядит десятичная валюта. Для туризма это неверная настройка по четырём отдельным причинам.
Первая: не у всякой валюты есть разменная единица. У японской иены и корейской воны её нет; цена с двумя знаками после запятой читается на этих рынках как программный артефакт, а округление с шагом 0,01 в валюте без копеек — арифметика над несуществующей единицей.
Вторая: конвертированная цена выдаёт себя. Число вроде 1 236,47 объявляет, что оно результат умножения. Читающий понимает, что за ним стоит другое число, и естественный следующий шаг — пойти искать его в другом месте. Цена, попавшая на круглый шаг, читается как ваша цена.
Третья: направление. Округление к ближайшему шагу симметрично: отклонения взаимно гасятся на объёме, маржа не страдает. Округление всегда вверх каждый раз добавляет тонкий слой, всегда вниз — этот слой дарит. И то и другое нормально как осознанная политика. Плохо — выбрать её случайно, в неверную сторону, а потом удивляться, почему валовая маржа на одном рынке чуть ниже остальных.
Четвёртая — порядок операций, и она бьёт больнее всего. Конвертировать, затем добавить наценку, затем округлить один раз в конце. Движок, который округляет нетто при конвертации и ещё раз после наценки, округлил дважды, и второе округление применено к числу, уже потерявшему остаток. Умножьте это на тариф, таксы и дополнительные услуги, которые тарифицируются отдельными компонентами: итог перестаёт быть суммой частей. Это проблема сверки прежде, чем проблема ценообразования.
Округляйте компоненты или итог, но не то и другое сразу, и проверьте, что показанное в счёте сходится, когда субагент перенесёт его в таблицу. Он перенесёт.
Три способа это вести
Ниже не уровни тарифа, а три разных ответа на вопрос «что вы обещаете путешественнику», и нагрузка у них разная.
| Конвертация для показа | Прайс-листы по рынкам | Расчёт в каждом рынке | |
|---|---|---|---|
| Что это | Одна валюта расчёта; остальное рисует таблица курсов | Цены заданы вручную по рынкам, не выведены | Шлюз и банковский счёт на каждую валюту |
| Кто несёт FX | Вы, между обновлением курса и расчётом | Вы, до следующего пересмотра цен | Почти никто — вы держите каждую валюту |
| Возвраты | Нужен сохранённый курс дня продажи, иначе разницу платите вы | Чисто: возвращается то же число | Чисто |
| Контроль цены | Слабый. Ценовые точки — то, что выдал курс | Полный. Каждую точку выбираете вы | Полный |
| Учёт | Одна книга, просто | Одна книга, просто | Несколько книг, настоящая работа |
| Когда это верно | Большинству агентств и почти всегда | Рынок, где вы реально конкурируете ценой | У вас есть люди, объём и банк в этой стране |
Почти всем стоит начать с левого столбца и переносить один рынок в средний, когда он заслужит внимание. Правый столбец — операционное решение в костюме технического; если сегодня в компании никто не сверяет две книги, третья валюта эту привычку не создаст.
Во что обходится ошибка
Классика — возврат. Бронирование продано по одному курсу, отменено через шесть недель и возвращено по сегодняшнему, потому что другого у движка не было. Если курс сдвинулся в пользу путешественника, разницу заплатили вы; если в обратную — путешественник считает, что его обсчитали, и он не совсем неправ. Храните курс на момент продажи в самом бронировании и возвращайте по нему.
Тише выглядит кредит. Кредитные лимиты субагентов и расчётные инвойсы существуют здесь как полноценные сущности, а не как таблица в файле, — но это преимущество лишь тогда, когда лимит номинирован в валюте, в которой этот субагент реально продаёт. Лимит в USD у агента, продающего в KZT, уплывает при каждом движении курса, и обнаруживается это в худший момент: когда лимит блокирует выписку билета в аэропорту.
И медленное. Устаревшая таблица курсов не выдаёт ошибку. Она продаёт. Неделями это выглядит как необычно хороший объём на одном рынке — ровно до закрытия месяца, когда выясняется, что объём был скидкой, о которой вы не знали. Поэтому у таблицы курсов должны быть дата и ответственный, а не плановая задача, вывод которой никто не читает.
Прежде чем включать рынок
Ничего из этого не требует проекта. Требуются записанные решения, в таком порядке, до появления валюты в переключателе:
- Назовите валюту расчёта для этого рынка и поставщика с платёжным шлюзом, к которым она относится. Хватит одной фразы.
- Назовите, кто и как часто обновляет таблицу курсов, и покажите дату последнего обновления там, где её видит человек.
- Выберите шаг округления для каждой валюты, а не один общий, и отдельно проверьте валюты без дробной части.
- Убедитесь, что порядок такой: конвертация, наценка, одно округление, — и что компоненты в счёте дают итог.
- Убедитесь, что возвраты идут по сохранённому курсу дня продажи, а не по сегодняшнему.
- Проверьте, что кредитные лимиты субагентов и расчётные инвойсы в той же валюте, что и выписки, которые эти агенты читают.
Потом включайте, продавайте две недели и один раз сведите эти две недели руками. Первый рынок и есть тот, который покажет, какой из шести пунктов вы сделали неправильно.
Поведение валют — самая простая для демонстрации и самая трудная для аудита часть магазина, поэтому стоит увидеть реальные настройки прежде, чем проектировать вокруг них. Если хотите посмотреть, с чем сайт поставляется — список валют, таблицу курсов, админку, где живут наценки, — запустите сайт из мастера: он разворачивается на субдомене платформы и не просит карту. Если вы ещё решаете, использовать ли чужой движок вообще, сравнение своей разработки и white-label — это спор уровнем ниже, а что даёт сайт под собственным брендом закрывает остальное.
Курс — общедоступная информация. Ваше правило округления, ваш курс возврата и периодичность обновления — нет, и именно в этих трёх местах на самом деле решается маржа трансграничного бронирования.