Tilda · 7 мин чтения

Разные валюты на сайте Тильда: автоконвертация по курсу

Разные валюты на сайте Тильда - запрос, с которым ко мне приходят регулярно: у кого-то оптовые клиенты в Казахстане и Беларуси считают в долларах, у кого-то курс рассчитан на иностранных студентов, кто-то держит цену в евро для партнёров из ЕС. Из коробки Тильда работает только с одной валютой заказа на проект, и переключить её на лету для разных посетителей конструктор не умеет. Разбираю, как настраиваю автоконвертацию цен по курсу на практике: какой скрипт использую, откуда брать актуальный курс и на что смотреть в оплате, чтобы деньги не потерялись между отображением цены и списанием у эквайринга.

Зачем нужны разные валюты на сайте Тильда

Чаще всего запрос приходит в трёх вариантах. Первый - инфопродукты и курсы, когда часть аудитории живёт за пределами России и платит картой в 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 клик.

Пошаговая настройка конвертера валют на Тильде

Порядок действий, который использую на проектах:

  1. Фиксирую базовую валюту - обычно рубль, потому что в ней принимает оплату эквайринг.
  2. Определяю список валют для отображения: чаще всего это USD и EUR, реже добавляют KZT или BYN под конкретный сегмент аудитории.
  3. Выбираю источник курса и частоту обновления - раз в сутки для большинства каталогов, раз в час для проектов с быстро меняющимся курсом (например, продажа импортной техники).
  4. Вставляю скрипт в код сайта через панель настроек, проверяю на страницах каталога, карточки товара и в корзине отдельно - это разные шаблоны Тильды, и цена рендерится в них по-разному.
  5. Добавляю переключатель валют (обычная кнопка или select), который просто меняет отображаемый бейдж, не трогая исходную цену в рублях.
  6. Отдельно проговариваю с клиентом момент оплаты: если чек всё равно выставляется в рублях, на кнопке заказа и в корзине честно показываю итог в рублях, а валютный бейдж оставляю только справочным.

Шестой пункт - самый частый источник путаницы. Если нужен реальный приём оплаты в валюте, а не просто отображение, это уже не скрипт на пару часов, а интеграция с зарубежным платёжным шлюзом и отдельная логика в корзине, которая пересчитывает и итог, и способ оплаты в зависимости от выбранной валюты. Для такой задачи под конкретный магазин обычно нужна доработка корзины Тильды под мультивалютные платежи с учётом эквайринга, налогообложения и правил округления - это не типовой скрипт, а расчёт под конкретную бизнес-логику.

Способы обновления курса: сравнение

Способ Частота обновления Когда подходит
Ручной ввод курса в код Раз в неделю-две, вручную Каталог из 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 можно запрашивать чаще. Для большинства каталогов на Тильде обновления раз в сутки с кешированием на клиенте достаточно.

Легально ли указывать цены в валюте, отличной от рубля?

Показывать цену как справочную информацию в любой валюте не запрещено, но итоговый расчёт с покупателем на территории России обычно ведётся в рублях. Если планируется реальный приём оплаты в иностранной валюте через зарубежный шлюз, этот момент стоит обсудить отдельно с бухгалтером клиента, потому что здесь уже вступают правила валютного контроля и налогообложения.

Есть задача?

Обсудим в мессенджере

Расскажите, что нужно сделать — отвечу в течение 4 часов в рабочее время. Первая консультация бесплатно.

Самозанятый Калинкин Н. А. · работаю с физлицами и юрлицами

Продолжая пользование настоящим сайтом Вы выражаете своё согласие на обработку Ваших персональных данных (файлов куки) с использованием Yandex.Metrika.
Понятно