Разные валюты на сайте Тильда - запрос, с которым ко мне приходят регулярно: у кого-то оптовые клиенты в Казахстане и Беларуси считают в долларах, у кого-то курс рассчитан на иностранных студентов, кто-то держит цену в евро для партнёров из ЕС. Из коробки Тильда работает только с одной валютой заказа на проект, и переключить её на лету для разных посетителей конструктор не умеет. Разбираю, как настраиваю автоконвертацию цен по курсу на практике: какой скрипт использую, откуда брать актуальный курс и на что смотреть в оплате, чтобы деньги не потерялись между отображением цены и списанием у эквайринга.
Зачем нужны разные валюты на сайте Тильда
Чаще всего запрос приходит в трёх вариантах. Первый - инфопродукты и курсы, когда часть аудитории живёт за пределами России и платит картой в USD или EUR через сторонний шлюз, а основная цена в каталоге в рублях. Второй - опт и B2B, когда партнёр из Беларуси или Казахстана сверяет цену в долларах для собственной наценки, хотя платит всё равно в рублях по курсу дня. Третий - витрина для инвесторов или зарубежных клиентов, где валюта нужна просто для ориентира, без реального приёма платежей в этой валюте.
Во всех трёх случаях задача разная по сложности. Показать рядом с рублёвой ценой конвертированную сумму в долларах - это фронтенд-задача на пару часов. Принять оплату именно в валюте, а не в рублёвом эквиваленте - это уже интеграция с зарубежным платёжным шлюзом, потому что T‑Bank и большинство российских эквайрингов работают только с рублями и никакую другую валюту в чек не пропустят.
Почему Тильда не считает валюты сама
В настройках магазина у Тильды есть поле «валюта заказа», но оно одно на весь проект. Zero Block и движок Tilda Store рендерят цену как статичную строку: число из карточки товара плюс символ валюты, заданный один раз в настройках. Никакого пересчёта по курсу, никакого переключателя валют для посетителя в стандартном функционале нет, и в документации Тильды это тоже не заявлено как фича.
Попытки обойтись без кода обычно выглядят так: создают вторую версию страницы или отдельную коллекцию товаров под другую валюту и вручную вбивают туда цены. Работает, но курс приходится пересчитывать руками при каждом обновлении, а с каталогом на 50-100 товаров это отдельная работа на час-два каждую неделю. При частых колебаниях курса цифры быстро расходятся с реальностью, и клиент либо теряет на курсовой разнице, либо получает жалобы, что цена на сайте не совпадает со счётом.
Как устроена автоконвертация по курсу
Рабочая схема простая: цена в базовой валюте (обычно рубль) остаётся источником истины в самой Тильде, а рядом скриптом дорисовывается пересчитанное значение в нужных валютах. Пользователь видит и рубли, и, например, доллары, но правки цены по-прежнему делаются в одном месте - в карточке товара.
Откуда брать курс
Для большинства проектов достаточно официального курса ЦБ РФ через открытый JSON-эндпоинт (например, cbr-xml-daily.ru, который отдаёт данные ЦБ в удобном формате раз в сутки). Для инфобизнеса и SaaS, где важнее биржевой курс, а не официальный, беру курс с публичного API вроде exchangerate.host или аналогичного сервиса. Разница между официальным курсом ЦБ и биржевым обычно 1-3%, и для витринного отображения цены этого достаточно - для реальных расчётов с эквайрингом ориентируюсь на курс платёжного провайдера, а не на тот, что показан на сайте.
Скрипт пересчёта на клиенте
Скрипт вешаю в панель «Ещё код» на уровне сайта, с загрузкой курса при заходе на страницу и кешированием на сутки в localStorage, чтобы не дёргать API при каждом обновлении карточки. Важный момент: Тильда подгружает карточки товаров асинхронно (пагинация Zero Block, AJAX-загрузка), поэтому обычный запуск скрипта по DOMContentLoaded ловит не все блоки - приходится либо подписываться на событие загрузки товаров, либо использовать MutationObserver по контейнеру каталога.
async function convertPrices() {
const cached = localStorage.getItem('rateUSD');
const cachedDate = localStorage.getItem('rateDate');
const today = new Date().toISOString().slice(0, 10);
let rate = cached && cachedDate === today
? parseFloat(cached)
: await fetch('https://www.cbr-xml-daily.ru/daily_json.js')
.then(r => r.json())
.then(data => data.Valute.USD.Value);
localStorage.setItem('rateUSD', rate);
localStorage.setItem('rateDate', today);
document.querySelectorAll('.t-store__card__price-value, .t706__product-price').forEach(el => {
const priceRub = parseFloat(el.textContent.replace(/[^d.]/g, ''));
if (!priceRub) return;
const usd = (priceRub / rate).toFixed(0);
const badge = document.createElement('span');
badge.className = 'price-usd-badge';
badge.textContent = ' (~' + usd + ' $)';
el.after(badge);
});
}
convertPrices();
document.addEventListener('tildaonload', convertPrices);
Это рабочий каркас, а не готовое решение под конкретный проект: под реальный сайт добавляю переключатель валют, обработку каталога с фильтрами и защиту от повторного рендера бейджа при перезагрузке блока.
Бесплатный материал
🎁 Полезный скрипт в подарок
Подпишитесь на Telegram - пришлю готовый скрипт по этой теме.
Без спама. Отписка в 1 клик.
Пошаговая настройка конвертера валют на Тильде
Порядок действий, который использую на проектах:
- Фиксирую базовую валюту - обычно рубль, потому что в ней принимает оплату эквайринг.
- Определяю список валют для отображения: чаще всего это USD и EUR, реже добавляют KZT или BYN под конкретный сегмент аудитории.
- Выбираю источник курса и частоту обновления - раз в сутки для большинства каталогов, раз в час для проектов с быстро меняющимся курсом (например, продажа импортной техники).
- Вставляю скрипт в код сайта через панель настроек, проверяю на страницах каталога, карточки товара и в корзине отдельно - это разные шаблоны Тильды, и цена рендерится в них по-разному.
- Добавляю переключатель валют (обычная кнопка или select), который просто меняет отображаемый бейдж, не трогая исходную цену в рублях.
- Отдельно проговариваю с клиентом момент оплаты: если чек всё равно выставляется в рублях, на кнопке заказа и в корзине честно показываю итог в рублях, а валютный бейдж оставляю только справочным.
Шестой пункт - самый частый источник путаницы. Если нужен реальный приём оплаты в валюте, а не просто отображение, это уже не скрипт на пару часов, а интеграция с зарубежным платёжным шлюзом и отдельная логика в корзине, которая пересчитывает и итог, и способ оплаты в зависимости от выбранной валюты. Для такой задачи под конкретный магазин обычно нужна доработка корзины Тильды под мультивалютные платежи с учётом эквайринга, налогообложения и правил округления - это не типовой скрипт, а расчёт под конкретную бизнес-логику.
Способы обновления курса: сравнение
| Способ | Частота обновления | Когда подходит |
|---|---|---|
| Ручной ввод курса в код | Раз в неделю-две, вручную | Каталог из 5-10 позиций, курс меняют редко |
| Скрипт с API ЦБ РФ | Автоматически, раз в сутки | Большинство каталожных сайтов и магазинов на Тильде |
| Биржевой курс через сторонний API | Автоматически, до нескольких раз в сутки | SaaS, инфобизнес с оплатой через зарубежные шлюзы |
| Обновление курса через n8n-сценарий | По расписанию, с записью в CRM или базу | Когда курс нужен не только на сайте, но и в счетах, CRM, отчётах |
Последний вариант беру, если у клиента уже есть n8n и курс валют нужен не только на витрине, а ещё и в выставлении счетов или в отчётности. Сценарий раз в сутки забирает курс, кладёт его в Google-таблицу или базу на своём сервере и по вебхуку обновляет значение, которое подхватывает скрипт на сайте. Так курс синхронизирован между сайтом, бухгалтерией и CRM, а не живёт в трёх местах отдельно.
Частые ошибки при мультивалютности на Тильде
- Курс зашивают в код один раз при запуске и забывают обновлять - через два-три месяца цена в валюте расходится с реальностью на 10-15%.
- Не задают правило округления, и на витрине появляются цены вида «47,83 $» вместо аккуратных «48 $» или «47,99 $».
- Путают отображаемую валюту с валютой платежа - клиент видит цену в евро, а на кнопке заказа списание всё равно происходит в рублях по курсу, о котором покупатель не знал заранее.
- Забывают про НДС и налоги для сделок с иностранными покупателями - это отдельный расчёт, который не сводится к простому пересчёту по курсу, и его стоит проверять отдельно от логики отображения цены.
- Не тестируют скрипт на мобильной версии каталога - на Тильде мобильная и десктопная вёрстка карточки товара иногда используют разные CSS-классы, и селектор, работающий на десктопе, на телефоне цену не находит.
Последняя ошибка встречается чаще, чем кажется: проверяю пересчёт цены отдельно на десктопе, планшетной и мобильной раскладке, а не только в одном разрешении экрана.
Автоматическая конвертация валюты на Tilda
Проблема Tilda из коробки не умеет показывать цены в альтернативной валюте по живому курсу. Если вы продаёте в несколько стран или работаете с валютой, которой…
от 6 000 ₽
Готовый скрипт →Частые вопросы
Как перевести все цены на Тильде в доллары автоматически?
Через скрипт, который забирает курс из внешнего API (например, ЦБ РФ) и пересчитывает значения цен, найденные в DOM каталога, добавляя рядом конвертированную сумму. Штатных настроек для этого в Тильде нет, поэтому без кода не обойтись.
Можно ли показывать цену в рублях и в валюте одновременно?
Да, и это самый частый вариант на практике: рубль остаётся основной ценой для оплаты, а рядом бейджем показывается пересчитанная сумма в долларах или евро - для ориентира, без реального приёма платежа в этой валюте.
Как часто обновляется курс валют в конвертере?
Зависит от источника и настроек скрипта: курс ЦБ РФ публикуется раз в сутки, биржевые курсы через сторонние API можно запрашивать чаще. Для большинства каталогов на Тильде обновления раз в сутки с кешированием на клиенте достаточно.
Легально ли указывать цены в валюте, отличной от рубля?
Показывать цену как справочную информацию в любой валюте не запрещено, но итоговый расчёт с покупателем на территории России обычно ведётся в рублях. Если планируется реальный приём оплаты в иностранной валюте через зарубежный шлюз, этот момент стоит обсудить отдельно с бухгалтером клиента, потому что здесь уже вступают правила валютного контроля и налогообложения.