Привіт — я побачив твоє повідомлення сьогодні вранці, скріншот того, як хтось у чаті підтримки твого застосунку питає «як тобі за це заплатити». Щиро вітаю. Це той момент, коли пет-проєкт перестає бути демо. Це також момент, коли сотня дрібних рішень, які ти відкладав, звалюються на тебе в один і той самий вівторок. Ти попросив просто сказати, що робити. Я так і зроблю, але спершу хочу пояснити, чому саме так, бо розуміння «чому» позбавить тебе потреби питати мене знову через три місяці, коли замість Stripe буде Lemon Squeezy, або замість разової оплати — підписка.
Рішення, яке ти насправді приймаєш
Ти сформулював це як «яким платіжним провайдером скористатися», але насправді це два рішення, накладені одне на одне. Перше: чи хочеш ти сам бути офіційним продавцем (merchant of record), чи хочеш, щоб цю роль взяв на себе хтось інший? Друге: яка форма твого біллінгу — разова покупка, підписка чи оплата за використання? Помилишся з першим — і через півроку витратиш вихідні на реєстрацію ПДВ у країні, в якій ніколи не був. Помилишся з другим — це просто незручна міграція, а не юридична проблема, тож це менш страшна помилка з двох.
Бути офіційним продавцем (merchant of record) означає, що юридично саме ти продаєш товар. Ти отримуєш гроші, ти відповідаєш за розрахунок податку з продажів і ПДВ у кожній юрисдикції, де живуть твої клієнти, і саме ти подаєш звітність. Stripe із задоволенням розрахує цей податок за тебе (Stripe Tax), але розрахунок — це не перерахування: тобі все одно доведеться реєструватися й подавати звітність у кожному місці, де ти перевищиш поріг. Сервіс типу merchant of record, як-от Lemon Squeezy або Paddle, знімає з тебе всю цю проблему: юридично продавцем є вони, вони збирають і перераховують податки скрізь, а тобі виплачують суму за вирахуванням цього. За це ти віддаєш частину маржі.
| Варіант | Хто продавець | Типова комісія | Обробка податків | Найкраще для |
|---|---|---|---|---|
| Stripe (напряму) | Ти | ~2,9% + $0,30/транзакцію, +0,5% за Stripe Tax | Ти реєструєшся і подаєш звітність, Stripe лише розраховує | Ти очікуєш зростання понад кілька тисяч на місяць і хочеш нижчі комісії в довгостроковій перспективі |
| Lemon Squeezy | Lemon Squeezy | ~5% + $0,50/транзакцію | Повністю на них, вони — офіційний продавець | Соло-розробник, перший продукт, взагалі не хочеться думати про податки |
| Paddle | Paddle | ~5% + комісії залежно від регіону | Повністю на них, більше орієнтовано на enterprise | SaaS із підписками та потребою у виставленні рахунків |
| PayPal | Ти | ~3,5-4,5%, спори вирішуються на користь покупця | Ти сам це вирішуєш | Для клієнтів, які довіряють саме PayPal, не варіант за замовчуванням |
На тому етапі, де ти зараз — один клієнт, простий продукт, ще незрозуміло, чи стане це бізнесом — я б порадив Lemon Squeezy або Paddle замість чистого Stripe. Ці додаткові два відсотки комісії — дешева страховка від того, щоб випадково стати платником податків у штаті, в якому ти ніколи не був. Ти завжди зможеш перейти на прямий Stripe пізніше, коли обсяги виправдають перехід і в тебе буде запал на паперову тяганину. Ніхто не переходить на іншого платіжного провайдера заради розваги, але це вирішувана справа на один вівторок, а не на цілий рік.
Я сам колись зробив цю помилку на попередньому проєкті — одразу пішов на Stripe, бо «всі користуються Stripe», отримував по кілька сотень доларів на місяць від жменьки європейських клієнтів, а через півтора року отримав дуже ввічливий, але дуже заплутаний лист про реєстрацію VAT MOSS. Це коштувало мені пообіддя з бухгалтером і сорока хвилин чистої паніки з гуглінням «чи винен я гроші Нідерландам». Не катастрофа. Але цілком можна було уникнути.
Перш ніж торкатися боєвих ключів
Що б ти не обрав, не підключай це одразу в продакшн-режимі. У кожного з цих провайдерів є тестовий/пісочний режим із фейковими номерами карток, які викликають конкретні результати — успішна оплата, відхилена картка, потрібна 3D Secure, недостатньо коштів. Прожени всі ці сценарії, перш ніж торкнутися справжнього ключа. Саме сценарії відмов ти й зустрінеш на практиці в перший тиждень, а налагоджувати їх наживо, коли прив'язана справжня картка реальної людини, — набагато менш весело.
У чаті з побудовою застосунку прямо скажи, що хочеш поетапного підходу: попроси спершу підключити інтеграцію в тестовому режимі з чітко видимим банером або прапорцем, щоб ніхто — включно з тобою у майбутньому — випадково не списав кошти з реальної картки під час тестування. Потім зроби окремий, свідомий крок для підстановки боєвих ключів. Два запити, а не один, навіть якщо швидше було б сказати «додай оплату» і дозволити системі вгадувати режим. У цьому тертя і полягає сенс.
Тобі також треба вирішити, що станеться, якщо webhook спрацює, а твій сервер лежить, гальмує, або подія прийде двічі. Це не гіпотетичний сценарій — таке трапляється в перший же тиждень, гарантовано. Ось мінімум подій, які тобі справді потрібно обробити:
checkout.session.completed(або аналог) — надайте доступ, це той момент, коли клієнт стає клієнтомinvoice.payment_failed— для підписок вирішіть заздалегідь, чи це миттєве блокування, чи пільговий період, адже «миттєве блокування» справді залишає погане перше враження через тимчасовий збій із карткоюcustomer.subscription.deleted— хтось скасував підписку, відкликайте доступ у кінці оплаченого періоду, а не одразу, якщо ваші умови не передбачають іншого- Подія повернення коштів — вирішіть один раз, письмово для себе, якою насправді буде ваша політика повернень, ще до того, як перший запит на повернення змусить вирішувати це наживо
Ідемпотентність важлива тут більше, ніж майже будь-де в застосунку. Якщо webhook прийде двічі — а він прийде, провайдери повторюють запит при будь-якій відповіді, відмінній від 200 — не можна надавати доступ двічі або, гірше, двічі списувати внутрішній стан. Зберігайте ID події та перевіряйте, чи не оброблялася вона раніше, перш ніж діяти.
Питання про ціноутворення, якого ти уникаєш
Ти згадав у повідомленні, що не впевнений, брати $9/місяць чи разову оплату $49. Я не думаю, що якийсь з варіантів неправильний, але зверни увагу, чого ти насправді уникаєш: розмови з клієнтом про те, в чому регулярна цінність. На разову ціну легше погодитися, і тобі легше її реалізувати (без dunning, без обробки невдалих поновлень, без флоу скасування). Підписка — це ставка на те, що ти продовжуватимеш достатньо покращувати продукт, щоб люди не йшли, а це реальне зобов'язання, а не просто галочка на сторінці цін. Якщо не впевнений, що активно працюватимеш над цим через півроку, разова ціна — чесніша пропозиція. Тарифний план підписки завжди можна додати пізніше, коли з'явиться щось постійне, на що можна підписуватися.
Ще одне, і тоді відпущу тебе: розмісти на сторінці справжню політику повернень і скасування ще до того, як візьмеш перший долар, навіть якщо це всього три речення. Не тому, що хтось судитиметься через $9, а тому, що написання цього змушує тебе справді це вирішити, а «розберуся, коли хтось запитає» — це спосіб прийняти таке рішення посеред злого листа, а не спокійним пообіддям.
Іди підключай пісочницю. Напиши мені, коли проженеш через неї фейкову відхилену картку — ось та версія «воно працює», яка справді має значення.



