안녕하세요 dev.to,
이것은 이상한 이야기이고 나는 이를 공유하고 싶었습니다. 계속 따라오세요, 결제 처리 부분은 정말 웃긴 일입니다.
나는 15살이며 러시아에 살고 있으며, 지난 세 주간의 치열한 혼자 코딩 동안에 Doday를 만들었습니다. — 웹 앱, Telegram 미니 앱, 그리고 Telegram 봇으로 실행되는 할 일 앱으로, 모든 것이 하나의 백엔드를 공유합니다. 기본적으로 Todoist 대안으로, Pomodoro 기능, 카ンバ닝 보드, 학교 포털 동기화(러시아 학생용 — 이것이 진짜 장벽입니다), 그리고 팀 협업 기능이 내장되어 있습니다.
이곳에서 시도해보세요: getdoday.ru · 코드: github.com/SwairIt/doday · 봇:Telegram의 DodayTaskBot
돈을 벌이는 부분에 대해 이야기하고 싶어요. 다른 미성년자들이 제품을 판매하려고 할 때 유용할 수 있을 거라 생각해서요.
문제
나는 5월 2일부터 Doday를 만들어왔어요. 유료 플랜을 추가하고 싶을 때까지 앱에는 이미 작은 그룹의 사용자가 있었어요 (주로 친구들과 내 학교 사람들 그리고 몇몇 우연한 사람들). 나는BETA_FREE_FOR_ALL=true 환경 플래그로, 모두가 무료로 Pro 기능을 사용할 수 있게 되었습니다. 이는 출시 기간 동안 지속 가능했지만, 실제로 사람들이 이 서비스를 지불할 것인지 확인하고 싶었습니다.
계획은 간단했습니다: 러시아 결제 처리기(Russian payment processor)를 등록하면 (YooKassa, 이전에는 Yandex Kassa였으며 - 거의 지역의 Stripe와 같은 것), 그들의 체크아웃을 구현하고 끝났습니다.
"자영업자"로 등록되어 있어(самозанятый — 14세부터 부모의 동의와 함께 러시아에서 제공되는 세금 제도), 세금 식별자와 실제 은행 계좌가 있어. 이것이 충분하다고 생각했어.
두 날 안에 세 번 거절당함
YooKassa — 정부 ID를 통해 로그인(Госуслуги, 우리의 e-gov / 정부 서비스 단일 로그인과 동일). 즉각적인 거절:"Госуслуги에 자녀 계정이 있는 사용자는 로그인할 수 없습니다." 제 Госуслуги 계정은 완전히 검증되었습니다 — 세금을 이 계정으로 내고, 성인이 하는 모든 일을 합니다. 하지만 YooKassa는 출생일을 확인하고 만 18세 미만이면 주장할 수 없습니다. 엄격한 장벽입니다.
알겠습니다, 수동 입력. 저는 설명서 양식을 엽니다 — 그들은 스캔된 컬러 여권 업로드를 원합니다. 그들의 OCR은 출생일을 읽고 거부합니다. 전략적으로 흐릿하게 만든 날짜로 시도해 보았지만 — 한 시간 후에 "신분 확인이 불가능합니다"라고 나왔습니다. 같은 문제입니다.
네, T-Bank 인수 (다른 주요 러시아 프로세서). 가입 흐름이 "개인 사업자 또는 LLC로 등록되어야 합니다"에 도달합니다. 자영업자는 허용되지만 18세부터만 가능합니다. IP로 등록하려면 18세가 되어야 합니다 (16세는 법정 대리인의 동의와 공증서가 필요하지만, 은행은 이를 획득하기 위해 받지 않습니다).
네, 부모님 이름으로 등록합니다 이제 돈이 법적으로 그들에게 속해 있습니다. 고객과의 분쟁이 있으면 부모님이 그것을 논쟁해야 합니다. 세무서는 소득이 그들 것이라고 생각합니다. 만약 그들이 내일 참여하고 싶지 않다고 결정하면, 저는 어제 밤에 전체 지급 인프라를 잃게 됩니다. 그런 일은 없을 거예요.
네, 18세까지 기다려요_. 그것은 세 년 더입니다. 어떤 재정적 검증 없이 제품에 더 많은 시간을 투자할 수 없습니다.
진정으로 수익화를 포기하려고 했습니다. 그런데 Telegram Stars가 있다는 것을 기억했습니다.
Telegram Stars (XTR)
만약 모르면 — Telegram은 자체 앱 통화인 Stars (통화 코드)를 가지고 있습니다.XTR를 그들의 봇 API에 포함). 사용자들은 Telegram 클라이언트(Apple/Google 앱 내 구매)를 통해 이들을 구매합니다. 봇은 Stars를 통해 결제를 받을 수 있습니다(createInvoiceLink). 개발자들은 Stars 가치의 약 70%를 수익으로 받으며, TON 암호화폐를 통해 인출하거나 Fragment를 통해 인출할 수 있습니다.
주요 사항: BotFather (Telegram의 봇 관리 봇)은 13세부터 사용할 수 있습니다. 문서가 없습니다. 세금 식별자가 없습니다. 은행도 없습니다. 계약은 Telegram과 맺고 은행과는 아닙니다.
내가 15살 때, 이것이 유일하게 합법적인 결제 경로입니다.
나는 그것을 썼습니다.
나가 만든 것 (기술적)
-
스키마 이전 (
alembic 0039):users.pro_until(시간戳),star_payments테이블에UNIQUE(telegram_payment_charge_id)idempotency를 위한 -
제품 카탈로그 (
app/billing/products.py) — 가격의 단일 진실 출처입니다. Pro 1개월 = 250⭐, Pro 12개월 = 2500⭐, Pro 생애 동안 = 12500⭐. 이 파일을 편집하면 됩니다. -
HMAC 서명된 인보이스 페이로드 —
v1:{product}:{user_id_hex}:{nonce}:{sig}이 없으면 누구나 인보이스 URL을 가로채고 결제 전에 제품 코드를 "pro_forever"로 바꿀 수 있습니다. 이것이 있으면 서명이 깨지고 Bot API가 거부합니다. 페이로드 ≤80 바이트 (Telegram의 한계는 128입니다). -
Idempotent 결제 애플리케이션 — Telegram은 실패 시 webhook을 재시도합니다. 저는
star_payments에UNIQUE를 charge_id와 함께 삽입하고, 두 번째 삽입은 예외를 일으킵니다.IntegrityError→ 기존 행을 잡고 반환합니다. 이중 청구는 결코 없습니다. -
effective_tier()는pro_until을 인정합니다 — 만료된pro_until를 가진 유료 사용자는 자동으로 무료로 전환되며 cron 작업은 없습니다. 모든 요청마다 지연 평가를 수행합니다. 평생 구매는pro_until를 2099년으로 설정하여 경계값으로 사용합니다. -
갱신은 기존 것을 확장합니다
pro_until— Pro를 10일 남은 상태에서 1개월 구매해도 30일로 초기화되지 않습니다.current_pro_until + 30 days로 연장됩니다. (Todoist은 이 부분을 잘못 처리합니다, 참고로.) -
환불 흐름 — 관리자 엔드포인트는
refundStarPayment봇 API를 호출하고pro_until을 롤백합니다. Telegram은 21일 이내에 환불을 허용합니다. -
봇 핸들러 —
PreCheckoutQueryHandler(10초 안에 답변해야 함, 서명 검증 + 금액 확인),MessageHandler(filters.SUCCESSFUL_PAYMENT)(성공적인 결제를 호출).
테스트: 서명, 위변조 거부, 금액 불일치, 단일 실행 가능성, 갱신 계산, 수명 경계값, 만료→무료 대체 테스트 24개 단위 테스트.
미니 앱 UI는 Telegram.WebApp.openInvoice(url, callback)를 앱 내 결제에 사용. 웹 UI는 데스크톱 대체로 새 탭에서 청구 URL을 엽니다.
나도 보안 허점을 닫았어 — POST /api/billing/change-tier는 인증된 사용자가 {"tier": "pro"}를 POST하여 무료로 Pro로 업그레이드할 수 있게 하기도 했었어. 같은 날에 닫았어. Stars를 출시한 당일에. 업그레이드는 이제 402 Payment Required가 필요하고, 무료로 다운그레이드만 자동 서비스가 가능해.
현재 수익화에 대한 중요한 주의사항
나는 Stars를 출시했지만현재 서비스는 베타 테스트 중이며, 프로 기능은 모두에게 무료입니다 아직 누구도 비용을 지불하고 있지 않으며, 저는 강요하지 않습니다. 베타 테스트를 종료하면 유료 모드로 전환하며, 기존 사용자(그 전환 이전에 등록된 모든 사용자)는 이미 만든 모든 것과 함께 무료로 남게 됩니다. 미니 앱에는 창립자 스타일의 "프로 영원히" 제안이 있으며, 12500 ⭐입니다. — Pro를 유료 모드가 복귀하기 전에 잠그고 싶은 사람들을 위해. 필수는 아님. 구매하지 않으면 Free로 전환될 거야.
그래서 수익화는 설계상 선택 사항으로 연결되어 있어. 제품이 안정화되고 성장하기 시작하면 정식으로 출시될 거야.
스택 (관심 있으면)
- FastAPI 0.115 + async SQLAlchemy 2.0 + Pydantic v2
- PostgreSQL 16 (asyncpg)
- Jinja2 + HTMX + Alpine.js + Tailwind via CDN — no React, no build step
- 봇 워커용 python-telegram-bot v21
-
mypy --strict각 커밋마다 pre-commit을 통해 강제 적용 - ~20k 줄의 Python, 850+ pytest 테스트, 39 Alembic 마이그레이션
- 한 줄 배포:
git push→ 생산용 VPS에서 cron-poll이 매 분마다 실행되어 마이그레이션을 적용하고 uvicorn을 재시작. 약 60초 안에 라이브.
Claude Code를 사용하는 것에 대해
나는 Claude Code (Anthropic의 AI 코드 보조 도구)와 함께 Doday를 작성했습니다. 숨기지 않아요 — 아키텍처 결정은 내가 했지만, Claude는 빠른 타이핑을 하고 코드베이스를 잘 기억하는 사람이었어요. 각 커밋은 푸시 전에 검토되었어요. 내가 이해하지 못하는 줄들은 내가 대담하게 설명할 수 있을 때까지 다시 작성되었어요.
코드베이스가 AI의 덜미를 풍기지 않는 이유는 rails 때문이에요mypy --strict는 타입 오류로 빌드에 실패합니다. 모든 행동 변경에는 테스트가 포함되어 있으며, Jinja 리팩터는 Claude가 생성하는 나쁜 Alpine 패턴을 포착합니다. 그러한 보호대로, AI 보조는 단순히 빠른 파트너 프로그래머일 뿐입니다.
"진짜" 코딩으로 여기는지는 당신의 정의에 따라 달라집니다. 저는 그렇게 생각합니다. 단독으로 이렇게 많은 것을 출시하지 않았을 것입니다. 하지만 아키텍처와 리뷰에 대한 취향 없이는 잘 출시하지 않았을 것입니다.
성실한 통계
- 최초 커밋: 2026년 5월 2일
- 총 커밋: 511
- 테스트: 850
- ~20,000 줄의 파이썬 코드
- 활성 사용자: 적은 수, 주로 내 학교 + 친구의 친구들. 아직 마케팅을 정말 시도하지 않았다 — 이 레딧 게시물은 첫 번째 시도 중 하나다.
- 유료 사용자: 0 — 베타 모드, Pro는 모두에게 무료, 평생 제안은 선택 사항
- 지금까지의 수익: $0
- 로드맵: Family 티어용 부모 대시보드, 공개 API 토큰, Capacitor를 통해 마이니 앱을 래핑한 네이티브 iOS
요청하는 내용
만약 궁금해졌다면, 라이브 데모는 tại getdoday.ru — UI는 러시아어지만 영어 독자들은 브라우저 번역으로 이용할 수 있습니다. 모든 부분이 어떻게 맞는지 보고 싶다면 github.com/SwairIt/doday의 코드베이스가 더 흥미롭습니다 (미니 앱 인증, 스타즈 결제 흐름, 팀 공유, 옵트인 기능 플래그).
아키텍처에 대한 피드백이 있거나, 결제 흐름에 대한 의견이 있거나, "미성년자로서 SaaS를 배송하려고 했다"는 문제를 해결해 본 경험이 있다면 — 제게 들려줄 수 있을 것 같아요.
자신만의 Stars 통합을 배포해 본 분들에게는 한 부분에 대해 확신이 없어요: 현재 provider_payment_charge_id를 null 가능성으로 두고 있어요. 텔레그램이 실제로 이를 채우는 시점이 불확실하기 때문이에요. 아는 분이 있을까요?
그리고 리포지토리를 스타하면 — 진정으로 도움이 됩니다. 이걸 재미로 하고 있지 않아요, 결국 이걸 통해 생계를 유지하고 싶어요.
러시아에 사는 15살의 저로부터 안녕하세요.
수정: 러시아 소년이 레딧에 게시하는 이유를 궁금해하시나요 — Doday는 오픈 소스 MIT이며, 러시아 사용자를 넘어 성장하고 싶습니다. 코드베이스는 영어입니다 (docstrings, 변수 이름, 커밋 메시지 제외 — 그것들은 러시아 과거형). 따라서 기여가 환영합니다. 특히 Telegram Stars 통합은 일반적입니다 — 텔레그램을 가진 누구나가 무엇을 판매하는 누구에게나 작동합니다.












