$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:

  1. Free tier: 20 pesan per hari. Cukup buat nyobain.
  2. Paid upsell: Begitu free limit abis, bot nawarin subscription.
  3. 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

TierStars/hariHargaDaily MessagesTarget User
Free0$020Everybody
Basic385 Stars~$5200Casual users
Pro770 Stars~$10UnlimitedPower users
VIP1,540 Stars~$20Unlimited + foto library + prioritySimps / heavy users

Step-by-Step: Bikin Bot dari Nol

Prasyarat

ItemCost
VPS (2CPU, 4GB RAM)$12-15/bulan (DigitalOcean/Vultr)
Python 3.10+Gratis
Telegram Bot TokenGratis (dari @BotFather)
AI ModelGratis (Ollama + open-source model)
Telegram AccountGratis

Step 1: Dapetin Bot Token dari BotFather

  1. Buka Telegram, cari @BotFather
  2. Kirim /newbot
  3. Ikutin instruksi — dapet token kayak 123456:ABCdefGHIjklMNOpqrsTUVwxyz
  4. 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

HargaDalam $Dalam StarsRasanya
$4.99~$5385 StarsMurah — kurang dari kopi
$9.99~$10770 StarsMasuk akal — 2 kopi
$19.99~$201,540 StarsMahal — 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:

MetrikValue
Users in first week240
Free to paid conversion8.3% (20 users)
ARPU (Average Revenue Per User)$5.35
Revenue 14 hari$107
Cost (VPS)$12
Net profit$95
Waktu setup4 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

UsersConversion 8%Revenue/bulan (avg $5.35)Cost VPSNet
50040 paid$214$12$202
1,00080 paid$428$12$416
5,000400 paid$2,140$12$2,128
10,000800 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

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

ItemCost
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 HustleModal AwalPotensi/bulanWaktu SetupPassive?
Bot Telegram AI$12$100-4,0004 jam✅ Mostly
Dropshipping$50-200$200-2,0002 minggu❌ Full-time
Freelance AI writing$0$500-2,0002 jam❌ Time for money
Affiliate blogging$10-30$100-1,0003 bulan✅ After 3 bulan
YouTube channel$0$500-5,0006 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)

NicheDemandConversionMonetizationNotes
AI Girlfriend / Roleplay🟢 High8-15%Stars + foto libraryButuh uncensored model
Study Assistant🟡 Medium3-7%StarsSFW, bisa promosi ke kampus
Fitness Coach AI🟡 Medium4-8%Stars + custom plansBisa jual meal plan terpisah
NSFW Roleplay / Fantasy🟢 High10-20%StarsHarus 18+ verification
AI Therapist / Listener🟢 High6-12%StarsDisclaimer medis wajib
Business Assistant🔴 Low2-5%StarsKalah 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.


Wajib hukumnya:

  1. 18+ warning di /start — kalo bot lo NSFW
  2. Telegram ToS — bot gak boleh spam, gak boleh scam
  3. Telegram Stars ToS — payout cuma lewat TON/FTON wallet
  4. Age verification — minimal confirm user 18+ lewat button
  5. 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.