Когда вы продаёте в одной валюте, а платите в другой: как не потерять маржу
Курсы скачут, рубль качается, евро идёт по своим причинам. Если вы фиксируете цену клиенту сегодня, а платите поставщику через 90 дней — кто несёт валютный риск?
Туризм — это бизнес с долгим разрывом между «продано» и «оплачено поставщику». Клиент платит сегодня, отель платится за 30 дней до заезда, гид — после события, ресторан — постфактум. Между этими событиями курсы валют могут сдвинуться на 5%, 10%, в плохой день — на 15%.
И если у вас разные валюты на разных концах сделки, маржа испаряется без вашего участия.
Где именно прячется проблема
Самый частый вариант: вы продаёте тур в евро (или долларах), а большую часть издержек платите в местной валюте — рублях, сомах, лари, тенге. Считаем простой пример.
В апреле клиент покупает тур за €2 500. Маржа по плану — 25%, то есть €1 875 закладываем поставщикам, €625 — наша. На момент продажи это выглядит как 167 500 рублей оплат поставщикам при курсе 67 рублей за евро.
В июле, когда мы начинаем оплачивать ту же поставку, курс вдруг 75. Те же €1 875 теперь стоят 140 625 рублей. Кажется, что повезло.
Но есть и другая сторона. Допустим, клиент платит частично в рублях по курсу на день оплаты, а у вас зафиксирован счёт в евро. Если курс пошёл в обратную сторону — вы зарабатываете не €625, а €420. Маржа уехала на 30%, и вы ничего не сделали.
Это не теоретическая болячка. На бухгалтерских чатах эта тема всплывает каждый сезон.
Что значит «зафиксировать курс»
В банковской логике fx lock — это форвардный контракт: банк гарантирует курс на дату в будущем. В тур-операторской логике это проще: вы записываете, по какому курсу считается эта конкретная бронь, и не пересчитываете её, что бы ни случилось с реальным рынком.
Это работает в обе стороны. Если курс ушёл в вашу пользу, вы зарабатываете больше плана. Если против — вы заранее видите, какую маржу теряете, и решаете, что с этим делать: пересогласовать с поставщиком, перенести даты, поднять цену для будущих клиентов.
Главное — вы не путаете эти две вещи: одна бронь под старым курсом, другая под новым. Пересчитывать всю историю «по сегодняшнему курсу» — это ад в Excel и абсолютная неправда в отчёте.
Куда брать курсы
Тут важно — не делать «среднерыночный» курс из головы. У вас должен быть внешний источник, на который вы ссылаетесь в договоре с клиентом и в управленческой отчётности.
Для российского рынка стандарт — Центробанк (CBR). Курс берётся на дату оплаты или на дату фиксации, и эта строчка живёт в audit log: «такого-то числа курс был такой, потому что ЦБ так сказал».
Для еврозоны эквивалент — ECB. Для США — Federal Reserve, для Британии — Bank of England. У вас свой бизнес-кейс, главное правило одно: курс должен быть проверяемым из третьего источника.
Опасный вариант — брать курс с сайта поставщика. Технически удобно, потому что поставщик так и рассчитает, но юридически уязвимо: если поставщик обновил курс задним числом, вы тоже задним числом получили другие цифры в бухгалтерии. Ситуация, в которой вы не хотите оказываться.
Что должно быть в системе
Минимальная пригодная реализация выглядит так.
Таблица курсов с датой и источником. Каждый день с CBR и ECB прилетает свежий слепок. Никаких «средних» — точечный курс на дату, источник в графе.
Лок на бронь или на котировку. При выпуске брони (или официальной котировки клиенту) система записывает: эта сделка работает с фиксированным курсом X, источник такой-то, дата такая-то. Этот лок не меняется никогда.
Отдельный лок для котировок. Между «отправили клиенту цены» и «клиент согласился» проходит обычно несколько дней. За эти дни курс может уехать. Если вы отправили цену в евро, а клиент платит по сегодняшнему курсу через неделю, вы должны заранее решить: либо лок на момент котировки (рискуем мы), либо рекалькуляция в момент оплаты (рискует клиент). Без явного решения — рискуют оба и оба недовольны.
Audit log на все рекалькуляции. Если кто-то всё же пересчитывает старую бронь, в логе должно остаться: кто, когда, по какой причине. Не для бюрократии — для того, чтобы через полгода в споре с клиентом или с налоговой можно было сказать, на каком основании в счёте такая цифра.
Как это устроено в INITE Travel
В Phase 8 мы выкатили FxRate (ежедневный пулл с CBR и ECB через cron) и FxLock (фиксация на quote или booking, никогда не на оба сразу). Конвертация в lib/fx.ts имеет три исхода: forward, inverse через обратную пару, и null когда мост между валютами невозможен — null честнее, чем выдуманное число.
И всё, что касается оплат, идёт через нашу inite-billing-service. Stripe, Tinkoff, ЮKassa, СБП — выбор не на стороне приложения, а на стороне биллинга. Мы не привязываем интеграцию к конкретному рейл-провайдеру, потому что у российского туроператора в 2026 году спектр платёжных систем может смениться три раза за год.
Если вы строите свой стек — самое простое, что вы можете сделать прямо сегодня: завести таблицу daily_fx_rate с двумя источниками и вторую таблицу booking_fx_lock с привязкой одной валюты к другой. Дальше уже можно говорить о маржинальной аналитике и не получать сюрпризов в конце сезона.