Вопрос кажется бухгалтерским, а оказывается арифметическим: «прибавить один процент» и «удержать один процент» дают разные числа, и разница всегда не в пользу магазина.
Покупатель платит цену заказа, комиссия удерживается из пришедшего. Заказ на 100 USDT при ставке 1% приносит магазину 99. Просто, привычно по карточному эквайрингу и не требует объяснений покупателю.
Сумма к оплате увеличивается так, чтобы после удержания магазину досталась ровно цена заказа. Так делают обменники и сервисы с тонкой маржой, где отдать процент с оборота значит отдать треть прибыли.
И вот здесь начинается арифметика. Кажется, что нужно взять 100 и прибавить 1% — получится 101. Но комиссия берётся от суммы платежа, а не от цены заказа: с 101 удержится 1.01, магазину останется 99.99. Не хватило копейки.
Нужно решить обратную задачу: найти такую сумму x, что x − комиссия(x) = цена заказа. Для ставки 1% и цены 100 это 100 ÷ 0.99 = 101.0101…, то есть 101.010102 в минимальных единицах.
Дальше есть тонкость, о которой обычно не думают: суммы целые, а комиссия округляется вниз. Поэтому формула даёт не единственный ответ, и наивное округление вверх заставляет покупателя переплачивать лишнюю минимальную единицу почти всегда. Правильный ответ — наименьшая сумма, при которой магазин получает своё; её и показывает счёт.
При комиссии на покупателя счёт показывает обе величины: amount —
сколько платит покупатель, merchant_amount — сколько получит магазин.
Настройка сохраняется в самом счёте снимком: изменив её завтра, вы не поменяете
сумму уже выставленного счёта, которую покупатель уже увидел.
Настройка живёт на уровне проекта, так что для разных направлений можно завести разные проекты с разными правилами.