Привет — увидел твое сообщение сегодня утром, скриншот с вопросом «как мне вам заплатить» во входящих поддержки твоего приложения. Поздравляю, искренне. Это тот момент, когда побочный проект перестает быть демо. Это также момент, когда сотня мелких решений, которые ты откладывал, разом сваливаются на тебя в один и тот же вторник. Ты попросил просто сказать, что делать. Я так и сделаю, но сначала хочу объяснить почему, потому что именно это «почему» избавит тебя от необходимости спрашивать меня снова через три месяца, когда вместо Stripe будет Lemon Squeezy или вместо разовой оплаты — подписка.
Решение, которое ты на самом деле принимаешь
Ты сформулировал это как «какого платежного провайдера выбрать», но на самом деле это два решения, наложенных друг на друга. Первое: хочешь ли ты быть продавцом по договору (merchant of record) или пусть им будет кто-то другой? Второе: какая у тебя модель оплаты — разовая покупка, подписка или оплата по факту использования? Ошибешься с первым — и через полгода потратишь выходные на регистрацию НДС в стране, где никогда не бывал. Ошибешься со вторым — это будет всего лишь неприятная миграция, а не юридическая проблема, так что это решение менее опасное.
Быть продавцом по договору означает, что юридически продаешь товар именно ты. Ты собираешь деньги, ты отвечаешь за расчет налога с продаж и НДС в каждой юрисдикции, где живут твои клиенты, и подаешь отчетность. Stripe с радостью рассчитает этот налог за тебя (Stripe Tax), но расчет — это не перечисление: тебе все равно нужно регистрироваться и подавать отчетность в каждой стране, где ты превышаешь порог. Сервис-посредник продавца, такой как Lemon Squeezy или Paddle, снимает эту проблему с тебя полностью: юридически продавец — они, они собирают и перечисляют налоги везде и выплачивают тебе чистую сумму. Взамен ты отдаешь часть маржи.
| Вариант | Кто продавец | Типичная комиссия | Работа с налогами | Лучше всего для |
|---|---|---|---|---|
| Stripe (напрямую) | Вы | ~2,9% + $0,30/транзакцию, +0,5% за Stripe Tax | Регистрируешься и подаешь отчетность ты, Stripe только рассчитывает | Ты ожидаешь роста до нескольких тысяч в месяц и хочешь более низкие комиссии в долгосрочной перспективе |
| Lemon Squeezy | Lemon Squeezy | ~5% + $0.50/транзакция | Полностью на них, они являются продавцом по документам | Одиночный разработчик, первый продукт, не хочет вообще думать о налогах |
| Paddle | Paddle | ~5% + комиссии зависят от региона | Полностью на них, больше подходит для крупного бизнеса | SaaS с подписками и некоторыми потребностями в выставлении счетов |
| PayPal | Вы | ~3,5-4,5%, споры в пользу покупателя | Вы занимаетесь этим сами | Клиенты, которые доверяют именно PayPal, а не выбор по умолчанию |
Учитывая, где вы находитесь прямо сейчас — один клиент, простой продукт, пока непонятно, станет ли это бизнесом — я бы посоветовал Lemon Squeezy или Paddle вместо чистого Stripe. Лишние два процента комиссии — это дешёвая страховка от того, чтобы случайно не стать налоговым резидентом в штате, в котором вы никогда не были. Позже вы всегда сможете перейти на прямой Stripe, когда объёмы это оправдают и вы будете готовы к бумажной волоките. Никто не меняет платёжного провайдера ради удовольствия, но это решаемая задача на вторник, а не на весь год.
Я сам когда-то допустил эту ошибку в одном из предыдущих проектов — сразу пошёл на Stripe, потому что «все используют Stripe», собирал несколько сотен долларов в месяц от горстки европейских клиентов, а через восемнадцать месяцев получил очень вежливое, но очень непонятное письмо о регистрации VAT MOSS. Это стоило мне полдня работы бухгалтера и сорока минут чистой паники в гугле с запросом «должен ли я денег Нидерландам». Не катастрофа. Но вполне избежать можно было.
Прежде чем трогать боевые ключи
Что бы вы ни выбрали, не подключайте это сразу в продакшн-режиме. У каждого из этих провайдеров есть тестовый/песочный режим с фейковыми номерами карт, которые вызывают конкретные результаты — успешный платёж, отклонённая карта, требуется 3D Secure, недостаточно средств. Пройдите все сценарии, прежде чем трогать реальный ключ. Именно с путями ошибок вы столкнётесь на первой же неделе, и отлаживать их на живой карте реального человека куда менее приятно.
В чате сборки прямо укажите, что хотите поэтапный подход: сначала попросите подключить интеграцию в тестовом режиме, с чётко видимым баннером или флагом, чтобы никто — включая вас в будущем — случайно не списал деньги с реальной карты во время тестирования. Затем сделайте отдельный, осознанный шаг по замене на боевые ключи. Два запроса, а не один, даже если проще было бы просто сказать «добавь оплату» и позволить системе угадать нужный режим. В этом трении и есть смысл.
Также нужно решить, что происходит, когда срабатывает вебхук, а ваш сервер не работает, тормозит или событие приходит дважды. Это не гипотетическая ситуация — она возникает на первой же неделе, и стабильно. События, которые вам точно нужно обрабатывать, как минимум:
checkout.session.completed(или аналог) — предоставить доступ, это момент, когда клиент становится клиентомinvoice.payment_failed— для подписок решите сейчас, будет ли это мгновенная блокировка или льготный период, потому что «мгновенная блокировка» — по-настоящему плохое первое впечатление для карты, у которой случился временный сбойcustomer.subscription.deleted— кто-то отменил подписку, отзывайте доступ в конце оплаченного периода, а не сразу, если только ваши условия не гласят иное- Событие возврата средств — решите заранее, письменно для себя, какова на самом деле ваша политика возвратов, до того как первый запрос на возврат заставит вас решать это на ходу
Идемпотентность важна здесь больше, чем почти в любом другом месте вашего приложения. Если вебхук приходит дважды — а это случится, провайдеры повторяют отправку при любом ответе, отличном от 200 — вы не должны выдавать доступ дважды или, что ещё хуже, списывать деньги дважды по внутреннему состоянию. Сохраняйте ID события и проверяйте, что вы его ещё не обработали, прежде чем действовать.
Вопрос с ценообразованием, который вы избегаете
В своём сообщении вы упомянули, что не уверены, брать ли $9/месяц или разово $49. Я не думаю, что какой-то из вариантов неверен, но обратите внимание, чего вы на самом деле избегаете: разговора с клиентом о том, в чём заключается регулярная ценность. Разовую цену легче принять и легче реализовать вам (нет дожима неплательщиков, нет обработки неудачных продлений, нет процесса отмены). Подписка — это ставка на то, что вы будете продолжать улучшать продукт настолько, чтобы люди не уходили — это реальное обязательство, а не просто галочка на странице с ценами. Если вы не уверены, что через полгода всё ещё будете активно работать над этим, разовая цена — более честное предложение. Подписочный тариф всегда можно добавить позже, когда появится что-то регулярное, на что можно подписаться.
И ещё кое-что, а потом отпущу вас: разместите на странице реальную политику возврата и отмены, прежде чем принять первый доллар, даже если это всего три предложения. Не потому что кто-то подаст на вас в суд из-за $9, а потому что написание этой политики заставляет вас действительно принять решение, а «разберусь, когда кто-то спросит» — это способ принять решение о политике посреди гневного письма, а не в спокойный день.
Сначала настройте песочницу. Напишите мне, когда прогоните через неё фейковую отклонённую карту — вот это и будет та версия «оно работает», которая действительно важна.



