$107 Dalam 2 Minggu dari Bot Telegram yang Cuma Jalan di VPS $12
Seorang redditor bikin AI girlfriend bot di Telegram. 14 hari kemudian: $107 net. Bukan dari iklan, bukan dari affiliate — dari Telegram Stars. Botnya cuma jalan di VPS murah, pake model AI open-source yang gak pernah nolak.
Dan ini bukan cerita aneh. Ada yang bikin $3K+/bulan dari konsep yang sama.
Catatan: Artikel ini untuk edukasi. Bot dewasa/NSFW harus comply sama Telegram ToS (18+). Fokus kita: strategi monetisasi Telegram Stars yang legitimate — bisa buat NSFW ataupun SFW.
Kenapa Telegram Stars adalah Game Changer
Sebelum Telegram Stars, monetasi bot itu ribet:
- Butuh payment processor (Stripe, Midtrans)
- User harus isi kartu kredit
- Konversi drop because “ah males isi data”
Telegram Stars fix this:
flowchart LR
A[User mau premium] --> B[Klik /subscribe di bot]
B --> C[Telegram buka payment sheet Apple Pay/GPay]
C --> D[User tap sekali, beres]
D --> E[Stars masuk ke akun bot]
E --> F[Bot developer cairin ke TON/FTON]
style C fill:#2d6,color:#fff
style F fill:#4a4,color:#fff
Apple Pay, Google Pay, even kartu kredit — semua jalan lewat sheet bawaan Telegram. User gak perlu percaya lo dengan data kartu mereka. Telegram yang handle.
1 Star = $0.013 (nilai fluktuatif tergantung rate Telegram).
Model Bisnis: Free → Paid Upsell
Flow-nya sederhana:
- Free tier: 20 pesan per hari. Cukup buat nyobain.
- Paid upsell: Begitu free limit abis, bot nawarin subscription.
- Subscription: $4.99-$19.99/bulan — dibayar lewat Stars.
Kenapa 20 pesan/hari? Karena:
- User bisa ngerasain value-nya langsung
- Gak sempet puas karena cuma 20 pesan
- Conversion ke paid: 5-15% untuk niche yang tepat
Pricing Strategy yang Terbukti
| Tier | Stars/hari | Harga | Daily Messages | Target User |
|---|---|---|---|---|
| Free | 0 | $0 | 20 | Everybody |
| Basic | 385 Stars | ~$5 | 200 | Casual users |
| Pro | 770 Stars | ~$10 | Unlimited | Power users |
| VIP | 1,540 Stars | ~$20 | Unlimited + foto library + priority | Simps / heavy users |
Step-by-Step: Bikin Bot dari Nol
Prasyarat
| Item | Cost |
|---|---|
| VPS (2CPU, 4GB RAM) | $12-15/bulan (DigitalOcean/Vultr) |
| Python 3.10+ | Gratis |
| Telegram Bot Token | Gratis (dari @BotFather) |
| AI Model | Gratis (Ollama + open-source model) |
| Telegram Account | Gratis |
Step 1: Dapetin Bot Token dari BotFather
- Buka Telegram, cari @BotFather
- Kirim
/newbot - Ikutin instruksi — dapet token kayak
123456:ABCdefGHIjklMNOpqrsTUVwxyz - Kirim
/mybots→ pilih bot lo → Bot Settings → Payments → connect wallet buat nerima Stars
Step 2: Install Dependencies di VPS
# SSH ke VPS
ssh root@VPS_IP
# Update & install
apt update && apt upgrade -y
apt install -y python3-pip python3-venv git
# Setup project
mkdir ~/telegram-bot && cd ~/telegram-bot
python3 -m venv venv
source venv/bin/activate
# Install libraries
pip install python-telegram-bot==21.10 requests
# Install Ollama (buat AI lokal)
curl -fsSL https://ollama.com/install.sh | sh
# Download model — pilih salah satu:
# uncensored buat NSFW/roleplay
ollama pull noushermes2:7b # uncensored, 7B param
# atau SFW aja
# ollama pull llama3.2:3b # ringan, 3B param
# Test
ollama run noushermes2:7b "Halo, kamu adalah asisten AI yang ramah. Balas dengan singkat."
Step 3: Kode Bot Utama
# bot.py — Telegram bot with AI + Stars monetization
import asyncio
import logging
from datetime import datetime, timedelta
from collections import defaultdict
from telegram import Update, LabeledPrice
from telegram.ext import (
Application, CommandHandler, MessageHandler,
filters, PreCheckoutQueryHandler, CallbackContext
)
import requests
import json
# === CONFIG ===
TOKEN = "YOUR_BOT_TOKEN_FROM_BOTFATHER"
OLLAMA_URL = "http://localhost:11434/api/generate"
MODEL = "noushermes2:7b"
# Pricing in Stars
STAR_PRICES = {
"basic": {
"stars": 385, # ~$5
"messages_per_day": 200,
"label": "Basic"
},
"pro": {
"stars": 770, # ~$10
"messages_per_day": 9999,
"label": "Pro"
},
"vip": {
"stars": 1540, # ~$20
"messages_per_day": 9999,
"vip_access": True,
"label": "VIP"
}
}
FREE_DAILY_LIMIT = 20
# === STATE (in-memory — pake Redis/DB buat production) ===
user_subscriptions = {} # user_id -> expiry_date
message_counts = defaultdict(lambda: 0) # user_id -> count today
last_message_date = {} # user_id -> date
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# === HELPERS ===
def get_ai_response(user_message: str, user_id: int) -> str:
"""Generate AI response via Ollama."""
system_prompt = """Kamu adalah asisten AI yang ramah dan personal.
Balas dengan bahasa Indonesia yang santai.
Jaga percakapan tetap engaging.
Maksimal 3 paragraf."""
prompt = f"{system_prompt}\n\nUser: {user_message}\nAsisten:"
try:
resp = requests.post(OLLAMA_URL, json={
"model": MODEL,
"prompt": prompt,
"stream": False,
"options": {
"temperature": 0.8,
"num_predict": 512
}
}, timeout=30)
return resp.json()["response"].strip()
except Exception as e:
logger.error(f"Ollama error: {e}")
return "Maaf, lagi error teknis. Coba lagi nanti."
def check_daily_limit(user_id: int) -> tuple[bool, int]:
"""Check if user can send a message today. Returns (allowed, remaining)."""
today = datetime.now().date()
# Reset count kalo beda hari
if last_message_date.get(user_id) != today:
message_counts[user_id] = 0
last_message_date[user_id] = today
# Cek subscription
sub = user_subscriptions.get(user_id)
if sub and sub > datetime.now():
# Paid user — cek tier
tier = sub.get("tier", "basic")
limit = STAR_PRICES[tier]["messages_per_day"]
else:
limit = FREE_DAILY_LIMIT
used = message_counts[user_id]
remaining = limit - used
if remaining <= 0:
return False, 0
message_counts[user_id] += 1
return True, remaining - 1
# === HANDLERS ===
async def start(update: Update, context: CallbackContext):
msg = (
"Halo! Aku AI asisten pribadi kamu.\n\n"
"✨ **Gratis:** 20 pesan per hari\n"
"⭐ **Basic:** 200 pesan/hari — 385 Stars/bulan\n"
"⭐ **Pro:** Unlimited — 770 Stars/bulan\n"
"👑 **VIP:** Unlimited + akses foto — 1,540 Stars/bulan\n\n"
"Ketik /subscribe buat upgrade."
)
await update.message.reply_text(msg, parse_mode="Markdown")
async def subscribe(update: Update, context: CallbackContext):
"""Show subscription options."""
keyboard = [
[InlineKeyboardButton("Basic — 385 Stars/bulan", callback_data="sub_basic")],
[InlineKeyboardButton("Pro — 770 Stars/bulan", callback_data="sub_pro")],
[InlineKeyboardButton("VIP — 1,540 Stars/bulan", callback_data="sub_vip")],
]
reply = InlineKeyboardMarkup(keyboard)
await update.message.reply_text(
"Pilih paket subscription:",
reply_markup=reply
)
async def button_handler(update: Update, context: CallbackContext):
"""Handle subscription button clicks."""
query = update.callback_query
await query.answer()
tier = query.data.replace("sub_", "")
price_config = STAR_PRICES[tier]
# Send invoice via Telegram Stars
await context.bot.send_invoice(
chat_id=query.message.chat_id,
title=f"Subscription {price_config['label']}",
description=f"{price_config['messages_per_day']} pesan/hari" +
(" + akses VIP" if price_config.get("vip_access") else ""),
payload=f"sub_{tier}",
provider_token="", # Empty = Telegram Stars
currency="XTR", # XTR = Telegram Stars
prices=[
LabeledPrice("Subscription", int(price_config["stars"]))
]
)
async def pre_checkout(update: Update, context: CallbackContext):
"""Approve all incoming payments (validate payload here in production)."""
query = update.pre_checkout_query
await query.answer(ok=True)
async def successful_payment(update: Update, context: CallbackContext):
"""Activate subscription after payment."""
payload = update.message.successful_payment.invoice_payload
tier = payload.replace("sub_", "")
user_id = update.effective_user.id
# Set expiry 30 days from now
user_subscriptions[user_id] = {
"expires": datetime.now() + timedelta(days=30),
"tier": tier
}
await update.message.reply_text(
f"✅ Subscription **{STAR_PRICES[tier]['label']}** aktif!\n"
f"{STAR_PRICES[tier]['messages_per_day']} pesan per hari.",
parse_mode="Markdown"
)
async def handle_message(update: Update, context: CallbackContext):
"""Process incoming messages."""
user_id = update.effective_user.id
user_text = update.message.text
allowed, remaining = check_daily_limit(user_id)
if not allowed:
await update.message.reply_text(
"❌ Limit harian habis.\n"
"Ketik /subscribe buat upgrade ke unlimited."
)
return
# Ty ping indicator biar user tau bot lagi mikir
await context.bot.send_chat_action(
chat_id=update.effective_chat.id,
action="typing"
)
response = get_ai_response(user_text, user_id)
await update.message.reply_text(response)
# Reminder sisa pesan
if remaining <= 5 and remaining > 0:
await update.message.reply_text(
f"💡 Sisa {remaining} pesan gratis hari ini. "
"Ketik /subscribe buat unlimited."
)
# === MAIN ===
def main():
app = Application.builder().token(TOKEN).build()
app.add_handler(CommandHandler("start", start))
app.add_handler(CommandHandler("subscribe", subscribe))
app.add_handler(CallbackQueryHandler(button_handler, pattern="^sub_"))
app.add_handler(PreCheckoutQueryHandler(pre_checkout))
app.add_handler(MessageHandler(filters.SUCCESSFUL_PAYMENT, successful_payment))
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message))
logger.info("Bot started...")
app.run_polling(allowed_updates=Update.ALL_TYPES)
if __name__ == "__main__":
main()
Step 4: Jalankan Bot
cd ~/telegram-bot
source venv/bin/activate
# Jalanin di screen biar gak mati kalo SSH disconnect
screen -S telegram-bot
python3 bot.py
# Ctrl+A, D buat detach
Pricing Strategy yang Bikin People Actually Pay
Ini yang membedakan bot lo laku atau sepi.
1. Daily Limit yang Psychological
20 pesan/hari — bukan 5, bukan 100.
- 5 terlalu dikit → user langsung pergi
- 100 terlalu banyak → gak perlu bayar
- 20 pas: user dapet taste, tapi belum puas
2. The “Photo Library” Upsell (buat Roleplay/Girlfriend Bot)
Ini money maker utama:
PAID_FEATURES = {
"basic": {
"messages": 200,
"photos": 0, # No photo access
"roleplay_depth": "basic"
},
"pro": {
"messages": 9999,
"photos": 5, # 5 photos/day
"roleplay_depth": "advanced"
},
"vip": {
"messages": 9999,
"photos": 50, # Unlimited photo access
"roleplay_depth": "full",
"custom_personality": True
}
}
Foto bisa pake Stable Diffusion di VPS yang sama ($0 cost per foto selain listrik).
3. Telegram Stars Conversion Psychology
| Harga | Dalam $ | Dalam Stars | Rasanya |
|---|---|---|---|
| $4.99 | ~$5 | 385 Stars | Murah — kurang dari kopi |
| $9.99 | ~$10 | 770 Stars | Masuk akal — 2 kopi |
| $19.99 | ~$20 | 1,540 Stars | Mahal — tapi VIP |
Stars membuat barrier psikologis lebih rendah. Orang lebih rela spend “virtual stars” daripada nominal dollar.
Case Study: $107 Dalam 2 Minggu
Seorang Redditor di r/sidehustle post breakdown bot Telegram AI girlfriend-nya:
Angka pastinya:
| Metrik | Value |
|---|---|
| Users in first week | 240 |
| Free to paid conversion | 8.3% (20 users) |
| ARPU (Average Revenue Per User) | $5.35 |
| Revenue 14 hari | $107 |
| Cost (VPS) | $12 |
| Net profit | $95 |
| Waktu setup | 4 jam |
Apa yang dia lakukan beda:
- Pake uncensored AI model (gak filtered — soalnya filtered models nolak roleplay romantis/dewasa)
- Niche: lonely demographic — orang yang cari temen ngobrol
- Foto library: tiap hari generate foto pake SDXL
- Auto-respond 24/7: gak pernah offline
Revenue Scaling
| Users | Conversion 8% | Revenue/bulan (avg $5.35) | Cost VPS | Net |
|---|---|---|---|---|
| 500 | 40 paid | $214 | $12 | $202 |
| 1,000 | 80 paid | $428 | $12 | $416 |
| 5,000 | 400 paid | $2,140 | $12 | $2,128 |
| 10,000 | 800 paid | $4,280 | $48* | $4,232 |
*Perlu scaling VPS di 10K users (multi-server).
Realita: Banyak PPV (Pay-Per-View) Telegram bot services charge $149/bot/bulan + 10% revenue. Mereka punya client yang earn $3K+/bulan. Bukan angka gila.
The Money: Modal vs Potensi
Modal Awal
VPS 1 bulan: $12 (DigitalOcean 2CPU, 4GB)
Domain (opsional): $10 (kalo mau web landing page)
Bot token: $0
Ollama + model: $0
Python libraries: $0
Total: $12 — atau $22 kalo pake domain
Biaya Operasional Per Bulan
| Item | Cost |
|---|---|
| VPS | $12 |
| API rate (kalo pake OpenAI instead of Ollama) | $5-20 tergantung usage |
| Domain (yearly dipecah) | ~$0.83/bulan |
| Total | $12-33/bulan |
Income Scenarios
Scenario 1: Casual (1-2 jam/minggu)
- Target: 200 users
- Paid: ~16 users × $5.35 = $85/bulan
- Net: $73/bulan
- ROI: 608%
Scenario 2: Part-time (5 jam/minggu)
- Target: 1,000 users
- Paid: ~80 users × $5.35 = $428/bulan
- Net: $416/bulan
- ROI: 3,467%
Scenario 3: Full-time (20 jam/minggu)
- Target: 5,000-10,000 users
- Paid: ~400-800 users × $5.35 = $2,140-4,280/bulan
- Net: $2,128-4,232/bulan
- ROI: 17,733%
Comparison: Bot Telegram vs Side Hustle Lain
| Side Hustle | Modal Awal | Potensi/bulan | Waktu Setup | Passive? |
|---|---|---|---|---|
| Bot Telegram AI | $12 | $100-4,000 | 4 jam | ✅ Mostly |
| Dropshipping | $50-200 | $200-2,000 | 2 minggu | ❌ Full-time |
| Freelance AI writing | $0 | $500-2,000 | 2 jam | ❌ Time for money |
| Affiliate blogging | $10-30 | $100-1,000 | 3 bulan | ✅ After 3 bulan |
| YouTube channel | $0 | $500-5,000 | 6 bulan | ✅ After 6 bulan |
Bot Telegram AI: modal paling rendah, waktu paling cepat, potensi paling besar di bulan pertama.
Niche yang Worth It (Dari Data Riil)
| Niche | Demand | Conversion | Monetization | Notes |
|---|---|---|---|---|
| AI Girlfriend / Roleplay | 🟢 High | 8-15% | Stars + foto library | Butuh uncensored model |
| Study Assistant | 🟡 Medium | 3-7% | Stars | SFW, bisa promosi ke kampus |
| Fitness Coach AI | 🟡 Medium | 4-8% | Stars + custom plans | Bisa jual meal plan terpisah |
| NSFW Roleplay / Fantasy | 🟢 High | 10-20% | Stars | Harus 18+ verification |
| AI Therapist / Listener | 🟢 High | 6-12% | Stars | Disclaimer medis wajib |
| Business Assistant | 🔴 Low | 2-5% | Stars | Kalah sama ChatGPT gratis |
Kenapa Uncensored Model Penting?
Filtered models (GPT-4o, Claude, Gemini) nolak:
- Roleplay romantis → “I cannot engage in romantic roleplay”
- NSFW fantasy → “I cannot generate adult content”
- Dark humor → “I cannot engage with that”
Buat bot yang targetnya engagement tinggi, penolakan dari AI = death sentence. User langsung ilang.
Model abliterated (kayak Nous Hermes 2) gak nolak. Bisa roleplay apa aja. User betah.
Legal Disclaimer (Baca Ini Dulu)
Wajib hukumnya:
- 18+ warning di /start — kalo bot lo NSFW
- Telegram ToS — bot gak boleh spam, gak boleh scam
- Telegram Stars ToS — payout cuma lewat TON/FTON wallet
- Age verification — minimal confirm user 18+ lewat button
- No illegal content — revenge porn, child content, drugs = ban permanen
# Contoh age gate
AGE_GATE_KEYBOARD = [
[InlineKeyboardButton("✅ Saya 18+", callback_data="age_confirm")],
[InlineKeyboardButton("❌ Saya di bawah 18", callback_data="age_reject")]
]
async def start_nsfw(update: Update, context: CallbackContext):
await update.message.reply_text(
"⚠️ Konten dewasa. Harus 18+.",
reply_markup=InlineKeyboardMarkup(AGE_GATE_KEYBOARD)
)
Checklist 24 Jam Pertama
- Daftarin bot ke BotFather, dapet token
- Setup VPS ($12 — DigitalOcean/Vultr)
- Install Python 3.10+, python-telegram-bot, requests
- Install Ollama + pull model (noushermes2:7b atau llama3.2:3b)
- Copas kode bot.py, isi TOKEN lo
- Setup BotFather payment — connect TON wallet
- Test local: jalanin bot di screen, kirim /start
- Test payment flow: subscribe → bayar 1 Star → cek aktif
- Cek AI response: kirim 5-10 pesan, evaluasi kualitas
- Set pricing tiers: Basic 385 Stars, Pro 770 Stars, VIP 1,540 Stars
- Deploy ke production (screen/tmux/systemd)
- Post di 3 Telegram grup atau subreddit (r/TelegramBots, grup niche)
Total waktu: ~4 jam Modal: $12 Target minggu pertama: 50-100 users, 5-10 paid = $25-53
"/start" is just the beginning. Yang bikin duit adalah konsistensi: improve prompt, tambah fitur, dengerin feedback user. Satu bot bisa jalan 6-12 bulan tanpa banyak maintenance.