Я уже больше года работаю над проектом Language Dove, и наконец пришло время его монетизировать.
В этой статье - мой опыт с двумя платёжными сервисами: американским MoR (merchant of record) Paddle и интернет-эквайрингом от IDBank в Армении, а также технические детали интеграции с тем из них, который я в итоге выбрал.
Language Dove - это платформа для изучения языков: у меня есть курсы с нуля, интерактивные книги, упражнения на говорение.
Но главная фича сайта - это караоке-субтитры к фильмам с двумя видами перевода: адаптивным художественным и буквальным, но на уровне отдельных слов. Про то, как я их делаю, я недавно писал на Хабре.
Если у вас нормально работает YouTube, то фильмы с субтитрами можно посмотреть тут (с переводом на русский) или тут (с переводом на английский).
Если у вас проблемы с YouTube - есть демка на Google Drive: первая серия «Футурамы» с апскейлом до 2160p и с субтитрами, вшитыми прямо в видео.
В базовом варианте все переводы делаются автоматически. Однако, есть возможность подправить их вручную. Для «Футурамы» я так и сделал - это заняло ~2 часа, по часу на каждый вид перевода.
Я реализовал 2 вида монетизации:
Подписка на материалы сайта. Весь контент делится на платный и бесплатный - доступ к платному открывается единой подпиской. В библиотеке (курсы, книги, видео с субтитрами) у каждого материала хранится булевой флаг платности. Чуть сложнее с упражнениями на говорение: они разбиты на шесть уровней, каждый следующий (кроме последнего) вдвое длиннее предыдущего. Первый уровень (100 предложений) бесплатный, остальные - по подписке.

Заказ субтитров для кастомных видео. Пользователь оформляет заказ, оставляет контакты → мне приходит сообщение в Телеграм → я ему пишу, беру видео → я делаю субтитры → отдаю результат → пользователь платит. Нужны две страницы: страница заказа с калькулятором цен и страница оплаты после получения субтитров. Для пользователей из России вторая страница не используются - идёт расчет внутри РФ.

Живу в Ереване.
Ради проекта уволился с работы, оформил ИП, а затем бизнес-ВНЖ.
ИП-счёт открыл в IDBank - потому что у них есть интернет-эквайринг.
Гражданство РФ.
Stripe - самый популярный выбор у американских фаундеров, но в Армении он не работает. Есть обходной путь через удалённую регистрацию компании в США, но это даже на словах звучит запредельно сложно.
Я посмотрел другие американские сервисы: Lemon Squeezy, Paddle, Dodo Payments, FastSpring. Везде на определённом этапе требуется верификация по паспорту.
Patreon тоже рассматривал, но быстро отбросил. «Поддержите нас на Patreon, чтобы получить доступ к платным фичам сайта» - я такого ни на одном серьёзном сайте не видел. Для западной аудитории это выглядело бы схематозно и подозрительно.
Тогда я вспомнил про IDBank и решил подать заявку на «виртуальный POS-терминал» (это они так называют интернет-эквайринг). Сайт банка жёстко глючил, подать онлайн не получилось - пришлось звонить, и оператор оформила заявку по телефону.
Решил обходить сервисы по возрастанию популярности - в моём представлении, менее популярный сервис с большей вероятностью будет добрее к русским.
Dodo отбросил сразу: верификация там происходит уже после настройки аккаунта и получения первых платежей. То есть ты всё подключаешь, получаешь деньги - и тут тебе: «а теперь покажите паспорт». Нет, спасибо.
На следующий день после регистрации пришло письмо
Понял, что шансов мало, но на всякий случай я подробно расписал свою ситуацию. Ожидаемо отказали, причём формулировка породила больше вопросов, чем ответов:
Какое отношение русский паспорт имеет к валюте? (Мой ИП-счёт, естественно, долларовый.) Может, имели в виду «current restrictions»?
На очереди Paddle.
В Paddle для работы с реальными деньгами нужно пройти две стадии верификации: проверка сайта и верификация личности.
С первой стадией всё прошло относительно гладко.
Нужно было добавить стандартные юридические страницы: Terms of Service, Privacy Policy, Refund Policy и Pricing.
После отправки на проверку через 3 дня пришло письмо с замечаниями:
1. Срок рефанда. Paddle требует минимум 14 дней на возврат - у меня было меньше, попросили исправить.
2. Распознавание речи. Потребовали убрать функцию распознавания речи в упражнениях на говорение с формулировкой: "Paddle cannot support products that have a voice-over feature". Я изучил список запрещённых продуктов - самое близкое к войсоверам - это "Content Generation with Voice Impersonations". Очевидно, сотрудник перепутал speech-to-text и text-to-speech. В ответном письме объяснил разницу, добавив, что распознавание речи используется практически всеми языковыми платформами.
3. Формат обучения. Спросили, предзаписаны ли материалы или я занимаюсь репетиторством вживую - последнее запрещено как "human services". Ответил, что всё предзаписано, и дал ссылку на курс испанского.
Ещё через 3 дня пришёл ответ - сайт одобрен.
Вспоминаем про IDBank. Ответа на заявку так и не было, поэтому я пошёл в отделение лично.
Сначала всё шло нормально - меня усадили обсуждать «виртуальный POS» с менеджером. Спрашиваю: есть стандартная процедура для подписочной модели? А если нет, то можно ли навелосипедить на основе разовых платежей? Менеджер кому-то позвонила и неуверенно ответила: подписок нет, но навелосипедить можно.
В остальном сервис устраивал: автоматический приём международных карточных платежей, деньги идут на счёт ИП напрямую. Писать кастомный код для подписки я не боялся.
Уже собирался оставлять заявку, но на всякий случай спросил: «А ничего, что сайт на английском»? Оказалось - сайт обязательно должен иметь армянскую версию. Спрашиваю: «Можно нейронкой перевести»? Менеджер не поняла. «Ну, искусственным интеллектом.» (Сказать «машинный перевод» я побоялся - подумает, что я собираюсь построчно гнать через Google Translate.) Она всё равно не поняла. Тогда напрямую: «Ничего, если перевод будет звучать немного коряво?» - «Ничего страшного, главное, чтобы всё было понятно.»
Ушёл из банка с задачей: добавить локализацию на армянский.
Я решил сделать полноценный переключатель языка - не только на армянский, но и на другие языки.
Для каждого языка хранится .json-файл с локализованными строками. Файл генерируется автоматически, после чего перевод можно поправить вручную. Строки сгруппированы по страницам - каждая страница переводится отдельным запросом к LLM.
Стратегия перевода зависит от типа страницы:
Для пользовательских страниц (лендинг, цены, блог, статьи по грамматике, страница заказа субтитров) используется транскреация, адаптивный перевод (такой же, как и для фильмов).
Юридические (ToS, Privacy Policy, Refund Policy) - прямой перевод, потому что транскреация может накреативить там, где это крайне неуместно.
Про различия обычного перевода и транскреации я писал в предыдущей статье. Для перевода использовал Claude Opus 4.5 - по моим личным бенчмаркам, модели Anthropic лучше других справляются с языковыми задачами.
Вручную переводы я не правил. Логика простая: если я поменяю хотя бы одно слово в английском тексте, при перегенерации получится другой перевод всей страницы, и ручные правки пойдут в мусорку. Лучше сначала прийти к финальным формулировкам на английском, а потом уже шлифовать переводы.
То, что вы видите на сайте в русской версии - это на 100% машинный перевод. По-моему, выглядит весьма достойно. А вот с армянским LLM справляются заметно хуже. Скорее всего, армянская версия ощутимо пахнет машинным переводом. Если среди читателей есть армяне - поделитесь впечатлениями, интересно.
После перевода сайта я снова пришёл в банк, и заявку наконец обработали.
Теперь самое «интересное» - верификация с паспортом РФ.
Paddle использует сервис Onfido: присылают ссылку, загружаешь фото документа и селфи, Onfido всё проверяет и возвращает вердикт. Россия в списке есть - можно отправить внутренний паспорт или загранпаспорт. Я выбрал загран.
Важный нюанс: принимают только фотографию, не скан. У меня камера на планшете сломана, а вебка - так себе. К счастью, нашлось старое фото заграна, снятое ещё рабочей камерой.
Отправил всё днём, ночью пришёл ответ:
Фото недостаточно чёткое, нужно переснять.
Нужен proof of address в несанкционной стране: utility bill или договор аренды.
Отправил семь документов в качестве proof of address:
текущий и 3 предыдущих ВНЖ
договор аренды
скриншоты оплаты коммуналки из банковского приложения (в Армении счета на физическую почту не присылают)
Фото решил переснять вебкой крупным планом.
Не прокатило - сказали, что все углы документа должны быть видны. Стало ясно, что с вебкой тут делать нечего. Пошёл в профессиональную фотостудию и сделал фото заграна в огромном разрешении. В ответе так и написал: камера плохая, обратился к профессионалам.
На этот раз к фото претензий не было. Зато попросили банковскую выписку с именем и адресом за последние 3 месяца.
А вот это проблема. В банке с личным счётом указан российский адрес (открывал в 2022-м, сразу после переезда). В банке с ИП-счётом мало транзакций, а армянский адрес не совпадает с адресом проживания - оформлял ИП удалённо, и компания вписала свой юрадрес вместо моего.
Попробовал сменить адрес в первом банке - отказали. Их устраивает только регистрация по адресу в паспорте, никакие другие документы не годятся; я делал регистрацию, но для предыдущего ВНЖ. Да и в выписке они адрес всё равно не указывают.
Делать нечего - отправил выписки из обоих банков и честно описал всю ситуацию. Для подтверждения адреса приложил справку о регистрации ИП.
Ответ снова про фото паспорта: у системы проблема с распознаванием (и это с профессиональным снимком!). Спросили, есть ли другой документ. Выбора нет - только потрёпанный временем внутренний паспорт РФ.
Снова пошёл в фотостудию. На этот раз сфоткал и загран, и внутренний паспорт по нескольку раз. Отправил всё.
В ответ - опять запрос proof of address в несанкционной стране. К этому моменту имена сотрудников Paddle начали повторяться - видимо, я перебрал их всех.
Снова отправил все документы.
На этот раз написали, что им нужно время проверить всё предоставленное. Через 3 дня пришло подтверждение - верификация пройдена. Ещё несколько дней занял «Final Review», но там прошло без проблем.
Ура, получилось! Наконец-то можно интегрировать монетизацию.
Через 2 недели после подачи заявки позвонили и попросили добавить на сайт логотипы Visa, Mastercard, ArCa и IDram. Добавил - сказали, что отправили на дальнейшую проверку.
Ещё через месяц - когда аккаунт Paddle уже был верифицирован, но монетизация ещё не внедрена - пришло письмо с отказом от IDBank.
Что именно им не понравилось - не знаю. Возможно, сайт не выглядел достаточно армянским: нет перевода материалов на армянский (только машинный перевод интерфейса); цены в долларах; в ToS указано, что английская версия имеет преимущественную силу.
В Paddle разработчик создаёт продукты, а для каждого продукта назначает одну или несколько цен.
Атрибуты цены:
Тип платежа: единовременный, ежемесячный или ежегодный
Значение для каждой страны - в долларах или другой поддерживаемой валюте (примерно у половины стран местная валюта не поддерживается)
Отображение: с НДС, без НДС или по традиции страны. В США цены указывают без НДС (он добавляется при покупке), в большинстве других стран - с НДС
Есть два вида API-ключей:
Фронтенд-ключ - публичный. Через него я получаю цены в локали пользователя для отображения на сайте
Бекенд-ключ - секретный. Я использую его для проверки наличия подписки
Также есть скидочные коды: задаём, к каким ценам применим код, а также размер скидки. Скидка срабатывает, когда пользователь вводит код на странице покупки.
Комиссия Paddle: 5% + $0.50 за транзакцию. Из-за фиксированных 50 центов невыгодно дробить крупные покупки на несколько транзакций.
Создаём продукты, цены и скидочные коды
На фронтенде делаем страницу с ценами - подтягиваем их c помощью фронтенд-ключа
По кнопке «Купить» / «Подписаться» - редирект на страницу оплаты Paddle. Контролируем её косвенно: можно передать email и скидочный код для автозаполнения
После покупки получаем событие на фронтенде и обновляем статус пользователя. Можно настроить вебхук для бекенда, но мне это не нужно - статус подписки проверяется при запросе контента
Пока подписка активна, Paddle сам списывает деньги по расписанию - с нашей стороны ничего не требуется.
Paddle хранит платёжные данные пользователей и предоставляет персональную ссылку на управление подпиской - отмена, смена платёжных данных. Эта же ссылка приходит в письме при покупке.
Я создал два продукта: ежемесячная подписка ($9/мес) и годовая($72/год, т.е. $6/мес). Отображение цены - по традиции страны, чтобы не раздражать пользователей.
Проблема: при автоконвертации, цены во многих локалях выглядят некрасиво - получаются нецелые числа, плюс отсутствует «психологический прайсинг» (199 вместо 200 - мозг видит «сто с чем-то» и воспринимает цену ниже).
Решение - скрипт, который автоматически вычисляет цены во всех валютах с учётом НДС-традиции и подбирает красивые числа, сохраняя примерно одинаковый доход с транзакции:
Вычисляем вещественное референсное значение в местной валюте
Ищем целое число, которое меньше референсного не более чем на 10%, но при этом у него либо отличается ведущая цифра, либо меньше цифр в записи
Если такого нет - просто округляем
Авторизация у меня через Supabase: magic link или Google. При нажатии «Подписаться» пользователь обязан быть авторизован - иначе он может вписать произвольный email, а Paddle его не проверяет. Неавторизованных просим сначала залогиниться.
Пользователь идентифицируется по email. На бекенд передаётся не email напрямую, а JWT-токен сессии - email извлекается из него через Supabase API.
Бекенд умеет по email:
Проверять наличие подписки
Возвращать ссылку на управление подпиской
Если у залогиненного пользователя уже есть активная подписка — кнопки «Подписаться» деактивируются (Paddle, как выяснилось, не контролирует повторную подписку на тот же продукт).
Если материал бесплатный → отдаём сразу.
Если платный → извлекаем email из JWT, проверяем подписку. Есть - отдаём. Нет - возвращаем ошибку, на фронтенде показываем попап «материал платный» с редиректом на страницу подписки.
Стоимость обработки видео зависит от:
Длины видео: короткое / среднее / длинное
Нужен ли адаптивный художественный перевод
Нужен ли контекстуальный перевод на уровне слов
Количества видео в заказе
Итого я создал 12 цен: 3 длины × 4 комбинации переводов. Скидки за объём реализованы через скидочные коды.
Внимание: цены указаны из расчета, что все переводы автоматические. Я в теории могу их улучшить вручную, но это весьма трудоёмко (напоминаю, на одну серию «Футурамы» ушло 2 часа). Можно об этом договориться отдельно.
Также я сверстал страничку для оплаты после выполнения заказа.
Все настройки задаются через параметры URL. Предполагается, что я сам формирую соответствующую ссылку и отправляю её пользователю.
Таким образом, монетизировать свой проект через Paddle возможно даже с российским паспортом; однако процесс верификации будет небыстрым.
Я рассказал про подводные камни монетизации и надеюсь, что кому-то помог не совершить ошибок.
Источник


