Cara Membuat Bot Telegram Expense Tracker Otomatis ke Google Sheet

Di era digital 2026, mengelola keuangan pribadi tidak perlu lagi ribet dengan aplikasi. Dalam tutorial ini, kamu akan membuat sistem pencatatan pengeluaran otomatis yang terdiri dari:

  • 🤖 Telegram Bot — Input pengeluaran cukup via chat
  • 📊 Google Sheet — Database + Dashboard otomatis
  • ⚡ Google Apps Script — Penghubung tanpa server

Hasil akhirnya? Setiap kali kamu chat pengeluaran 40000 cuci mobil ke bot, data langsung tercatat di spreadsheet dengan kategori otomatis dan dashboard real-time.


Langkah 1: Membuat Google Sheet Database

Pertama, buat Google Sheet baru. Struktur sheet ini menjadi fondasi seluruh sistem tracking kamu.

Struktur Tab yang Dibutuhkan

Buat 3 tab dengan nama berikut:

Nama Tab Fungsi Isi
Transaksi Database utama Tanggal, Kategori, Deskripsi, Jumlah, Tipe
Kategori Master data kategori Daftar kategori + budget bulanan
Dashboard Laporan visual Chart, summary, pivot table

Setup Tab Transaksi

Buat header di baris pertama (baris 1) dengan format berikut:

| A          | B         | C           | D           | E         |
|------------|-----------|-------------|-------------|-----------|
| Tanggal    | Kategori  | Deskripsi   | Jumlah (Rp) | Tipe      |
| 15/05/2026 | Makanan   | Makan siang | 35000       | Pengeluaran |

Tips: Format kolom A sebagai Date dan kolom D sebagai Currency (Rp) agar tampilan rapi.

Setup Tab Kategori

Buat daftar kategori standar yang akan digunakan oleh bot:

| A              | B           | C               |
|----------------|-------------|-----------------|
| Kategori       | Tipe        | Budget Bulanan  |
| Makanan        | Pengeluaran | 1500000         |
| Transportasi   | Pengeluaran | 1000000         |
| Belanja        | Pengeluaran | 2000000         |
| Tagihan        | Pengeluaran | 1500000         |
| Gaji           | Pemasukan   | 0               |
| Investasi      | Pengeluaran | 2000000         |
| Lainnya        | Pengeluaran | 500000          |

Catatan penting: Nama kategori harus konsisten antara sheet Kategori dan input bot nanti.


Langkah 2: Membuat Bot Telegram via BotFather

Untuk menghubungkan chat Telegram ke Google Sheet, kamu memerlukan Bot API Token dari Telegram.

Daftarkan Bot Baru

  1. Buka aplikasi Telegram, cari @BotFather
  2. Kirim perintah /newbot
  3. Masukkan nama bot (contoh: ExpenseTrackerKu)
  4. Masukkan username bot yang unik, harus diakhiri bot (contoh: expensetrackerku_bot)
  5. BotFather akan mengirimkan API Token — simpan baik-baik!

Contoh token yang akan kamu dapatkan:

123456789:ABCdefGHIjklMNOpqrsTUVwxyz123456789

Catat Informasi Penting

Simpan informasi berikut untuk langkah selanjutnya:

  • 🔑 BOT_TOKEN — dari BotFather
  • 📋 Sheet ID — dari URL Google Sheet (lihat Langkah 1)
  • 📄 Sheet Name — "Transaksi"

Langkah 3: Menulis Kode Google Apps Script

Ini adalah inti sistem — script yang menghubungkan webhook Telegram ke Google Sheet.

Buka Apps Script Editor

Dari Google Sheet kamu, klik menu Extensions → Apps Script. Tab baru akan terbuka dengan editor kode.

Hapus Kode Default & Paste Script

Hapus semua kode di Code.gs, lalu paste kode berikut:

// ============================================================
// TELEGRAM EXPENSE TRACKER BOT - Google Apps Script
// Version: 2.0 | Updated: Mei 2026
// ============================================================

// --- KONFIGURASI (GANTI SESUAI DATA ANDA) ---
const BOT_TOKEN = '123456789:ABCdefGHIjklMNOpqrsTUVwxyz';  // Token dari BotFather
const SHEET_ID = '1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms';  // ID dari URL Sheet
const SHEET_NAME = 'Transaksi';  // Nama tab database

// ============================================================
// WEBHOOK SETUP (Jalankan sekali saja dari editor)
// ============================================================
function setWebhook() {
  const webAppUrl = 'https://script.google.com/macros/s/' + 
                    ScriptApp.getScriptId() + '/exec';

  const url = 'https://api.telegram.org/bot' + BOT_TOKEN + '/setWebhook';
  const response = UrlFetchApp.fetch(url, {
    method: 'post',
    payload: { url: webAppUrl }
  });

  Logger.log('Webhook Response: ' + response.getContentText());
  Logger.log('WebApp URL: ' + webAppUrl);
}

// ============================================================
// MAIN HANDLER - Menerima pesan dari Telegram
// ============================================================
function doPost(e) {
  try {
    const update = JSON.parse(e.postData.contents);
    const message = update.message;

    if (!message || !message.text) {
      return ContentService.createTextOutput('OK');
    }

    const chatId = message.chat.id;
    const text = message.text.trim();
    const userName = message.from.first_name || 'User';

    // Parse input pengguna
    const result = parseExpense(text);

    if (result.success) {
      // Simpan ke Google Sheet
      saveToSheet(result.data);

      // Kirim konfirmasi ke Telegram
      sendMessage(chatId, formatSuccessMessage(result.data));
    } else {
      // Kirim pesan error/bantuan
      sendMessage(chatId, result.message);
    }

    return ContentService.createTextOutput('OK');

  } catch (error) {
    Logger.log('ERROR: ' + error.toString());
    return ContentService.createTextOutput('Error: ' + error.toString());
  }
}

// ============================================================
// PARSER - Mengubah teks chat jadi data terstruktur
// ============================================================
function parseExpense(text) {
  text = text.toLowerCase().trim();

  // Command: bantuan / help / start
  if (text === 'bantuan' || text === 'help' || text === 'start' || text === '/start') {
    return {
      success: false,
      message: getHelpMessage()
    };
  }

  // Deteksi tipe transaksi
  let tipe = 'Pengeluaran';
  let cleanText = text;

  if (text.startsWith('pengeluaran') || text.startsWith('keluar') || text.startsWith('out')) {
    tipe = 'Pengeluaran';
    cleanText = text.replace(/^(pengeluaran|keluar|out)\s*/, '');
  } else if (text.startsWith('pemasukan') || text.startsWith('masuk') || text.startsWith('in')) {
    tipe = 'Pemasukan';
    cleanText = text.replace(/^(pemasukan|masuk|in)\s*/, '');
  }

  // Extract jumlah (angka pertama dalam teks)
  const numberMatch = cleanText.match(/^(\d+(?:\.\d+)?(?:,\d+)?)\s*/);

  if (!numberMatch) {
    return {
      success: false,
      message: '❌ Format tidak dikenali.\n\nContoh benar:\n• pengeluaran 40000 cuci mobil\n• masuk 5000000 gaji bulanan\n• 150000 belanja mingguan'
    };
  }

  // Bersihkan format angka (hilangkan titik ribuan)
  const jumlah = parseInt(numberMatch[1].replace(/\./g, '').replace(/,/g, ''));
  const deskripsi = cleanText.replace(numberMatch[0], '').trim() || 'Tanpa keterangan';

  // Deteksi kategori otomatis dari deskripsi
  const kategori = detectCategory(deskripsi);

  return {
    success: true,
    data: {
      tanggal: new Date(),
      kategori: kategori,
      deskripsi: deskripsi,
      jumlah: jumlah,
      tipe: tipe
    }
  };
}

// ============================================================
// AUTO-CATEGORY DETECTION
// ============================================================
function detectCategory(deskripsi) {
  const desc = deskripsi.toLowerCase();

  const categories = {
    'Makanan': ['makan', 'snack', 'jajan', 'kopi', 'coffee', 'lunch', 'dinner', 'sarapan', 'jajanan'],
    'Transportasi': ['bensin', 'bbm', 'gojek', 'grab', 'ojek', 'taksi', 'bus', 'kereta', 'parkir', 'tol', 'go-', 'motor'],
    'Belanja': ['belanja', 'supermarket', 'grocery', 'minimarket', 'indomaret', 'alfamart', 'skincare', 'baju'],
    'Tagihan': ['listrik', 'pln', 'air', 'pdam', 'internet', 'wifi', 'bpjs', 'tagihan', 'pajak'],
    'Kesehatan': ['obat', 'dokter', 'rumah sakit', 'rs', 'apotek', 'vitamin', 'periksa'],
    'Hiburan': ['nonton', 'film', 'bioskop', 'game', 'spotify', 'netflix', 'youtube', 'hiburan'],
    'Pendidikan': ['kursus', 'buku', 'seminar', 'pelatihan', 'course', 'belajar', 'udemy'],
    'Investasi': ['saham', 'reksa dana', 'deposito', 'tabungan', 'emas', 'crypto', 'bitcoin'],
    'Perawatan Rumah': ['servis', 'perbaikan', 'cuci mobil', 'cuci motor', 'tukang', 'renovasi'],
    'Gaji': ['gaji', 'salary', 'income', 'pendapatan'],
    'Bonus': ['bonus', 'thr', 'komisi', 'insentif'],
    'Freelance': ['freelance', 'proyek', 'side hustle', 'part time'],
    'Lainnya': []
  };

  for (const [cat, keywords] of Object.entries(categories)) {
    for (const keyword of keywords) {
      if (desc.includes(keyword)) return cat;
    }
  }

  return 'Lainnya';
}

// ============================================================
// SAVE TO GOOGLE SHEET
// ============================================================
function saveToSheet(data) {
  const ss = SpreadsheetApp.openById(SHEET_ID);
  const sheet = ss.getSheetByName(SHEET_NAME);

  sheet.appendRow([
    data.tanggal,
    data.kategori,
    data.deskripsi,
    data.jumlah,
    data.tipe
  ]);
}

// ============================================================
// TELEGRAM MESSAGE FORMATTER
// ============================================================
function formatSuccessMessage(data) {
  const emoji = data.tipe === 'Pemasukan' ? '💰' : '💸';
  const tipeEmoji = data.tipe === 'Pemasukan' ? '📥' : '📤';

  return `${emoji} *${data.tipe} Tercatat!*\n\n` +
         `${tipeEmoji} *Jumlah:* Rp ${data.jumlah.toLocaleString('id-ID')}\n` +
         `🏷️ *Kategori:* ${data.kategori}\n` +
         `📝 *Deskripsi:* ${data.deskripsi}\n` +
         `📅 *Tanggal:* ${Utilities.formatDate(data.tanggal, 'Asia/Jakarta', 'dd/MM/yyyy HH:mm')}\n\n` +
         `✅ Data sudah masuk ke Google Sheet kamu.`;
}

function getHelpMessage() {
  return `🤖 *PANDUAN PENGGUNAAN BOT*\n\n` +
         `*Format Input:*\n` +
         `• pengeluaran [jumlah] [deskripsi]\n` +
         `• pemasukan [jumlah] [deskripsi]\n` +
         `• [jumlah] [deskripsi] (auto: pengeluaran)\n\n` +
         `*Contoh:*\n` +
         `• pengeluaran 40000 cuci mobil\n` +
         `• pemasukan 5000000 gaji bulanan\n` +
         `• 150000 belanja mingguan\n\n` +
         `💡 Bot akan otomatis mendeteksi kategori dari deskripsi.`;
}

// ============================================================
// SEND MESSAGE TO TELEGRAM
// ============================================================
function sendMessage(chatId, text) {
  const url = 'https://api.telegram.org/bot' + BOT_TOKEN + '/sendMessage';

  try {
    UrlFetchApp.fetch(url, {
      method: 'post',
      contentType: 'application/json',
      payload: JSON.stringify({
        chat_id: chatId,
        text: text,
        parse_mode: 'Markdown'
      })
    });
  } catch (e) {
    Logger.log('Failed to send message: ' + e);
  }
}

// ============================================================
// TEST FUNCTION (Jalankan dari editor untuk test)
// ============================================================
function testParse() {
  const tests = [
    'pengeluaran 40000 cuci mobil',
    'masuk 5000000 gaji bulanan',
    '150000 belanja mingguan',
    'bantuan'
  ];

  for (const test of tests) {
    Logger.log('Input: ' + test);
    Logger.log('Result: ' + JSON.stringify(parseExpense(test)));
    Logger.log('---');
  }
}

Penjelasan Fungsi Utama

Fungsi Kegunaan
setWebhook() Menghubungkan bot Telegram ke URL web app (jalankan sekali)
doPost(e) Handler utama yang menerima setiap pesan dari Telegram
parseExpense(text) Mengubah teks chat jadi data terstruktur (jumlah, kategori, tipe)
detectCategory(desc) AI sederhana untuk menebak kategori dari kata kunci deskripsi
saveToSheet(data) Menyimpan data ke baris terakhir Google Sheet
sendMessage() Mengirim balasan konfirmasi ke Telegram

Langkah 4: Deploy Web App & Aktifkan Webhook

Setelah kode siap, kamu perlu menerbitkan script agar bisa diakses dari internet.

Deploy sebagai Web App

  1. Klik tombol Deploy → New deployment (ikon roket)
  2. Klik ikon gear ⚙️ pilih Web app
  3. Description: Telegram Expense Bot
  4. Execute as: Me (email kamu)
  5. Who has access: Anyone (ini penting!)
  6. Klik Deploy
  7. Izinkan semua permission yang diminta (klik through warning)
  8. Copy Web App URL yang muncul (contoh: https://script.google.com/macros/s/AKfycb.../exec)

Jalankan setWebhook()

  1. Di Apps Script editor, pilih fungsi setWebhook dari dropdown
  2. Klik tombol Run (▶️)
  3. Buka View → Logs (atau Ctrl+Enter)
  4. Harus muncul: {"ok":true,"result":true,"description":"Webhook is set"}

Verifikasi Webhook

Buka browser, akses URL ini (ganti TOKEN):

https://api.telegram.org/bot[TOKEN_ANDA]/getWebhookInfo

Response yang benar:

{
  "ok": true,
  "result": {
    "url": "https://script.google.com/macros/s/AKfycb.../exec",
    "has_custom_certificate": false,
    "pending_update_count": 0
  }
}

Langkah 5: Membuat Dashboard Otomatis

Dashboard akan otomatis update setiap kali ada data baru dari bot.

Summary Card (Total Pemasukan & Pengeluaran)

Di tab Dashboard, buat formula berikut:

// Total Pemasukan (asumsi di cell B2)
=SUMIF(Transaksi!E:E,"Pemasukan",Transaksi!D:D)

// Total Pengeluaran (asumsi di cell B3)
=SUMIF(Transaksi!E:E,"Pengeluaran",Transaksi!D:D)

// Sisa Uang (asumsi di cell B4)
=B2-B3

Breakdown per Kategori (QUERY Formula)

Gunakan QUERY — fitur powerful Google Sheets:

=QUERY(Transaksi!A:E, 
       "SELECT B, SUM(D) 
        WHERE E='Pengeluaran' 
        GROUP BY B 
        ORDER BY SUM(D) DESC 
        LABEL SUM(D) 'Total Pengeluaran'", 
       1)

Insert Chart

  1. Block hasil QUERY di atas
  2. Klik Insert → Chart
  3. Pilih Pie chart atau Donut chart
  4. Atur title: Alokasi Pengeluaran per Kategori
  5. Tempatkan di area Dashboard

Trend Harian (Line Chart)

=QUERY(Transaksi!A:E, 
       "SELECT A, SUM(D) 
        WHERE E='Pengeluaran' 
        GROUP BY A 
        ORDER BY A ASC 
        LABEL SUM(D) 'Pengeluaran Harian'", 
       1)

Block hasilnya → Insert → Chart → Line Chart

Budget vs Actual (Conditional Formatting)

Tambahkan kolom "Sisa Budget" di tab Kategori:

=C2 - SUMIFS(Transaksi!D:D, Transaksi!B:B, A2, Transaksi!E:E, "Pengeluaran")

Tambahkan Conditional Formatting → Color scale (merah jika minus, hijau jika plus).


Langkah 6: Download Template Siap Pakai

Untuk mempercepat setup, saya telah buatkan template Excel yang bisa langsung diupload ke Google Sheets:

📎 Download Template Expense Tracker.xlsx

Isi template:

  • ✅ 14 kategori siap pakai dengan budget default
  • ✅ 20 data sample untuk testing
  • ✅ Dashboard dengan formula SUMIF & persentase
  • ✅ Dropdown validasi kategori
  • ✅ Conditional formatting (hijau=masuk, merah=keluar)
  • ✅ Sheet panduan lengkap

Cara pakai template:

  1. Download file .xlsx
  2. Upload ke Google Drive
  3. Klik kanan → Open with → Google Sheets
  4. Hapus data sample di tab Transaksi (baris 2-21)
  5. Lanjutkan ke Langkah 2 untuk setup bot

Troubleshooting Umum

Masalah Penyebab Solusi
Bot tidak merespon sama sekali Webhook belum aktif atau deploy access bukan "Anyone" Cek getWebhookInfo, redeploy dengan "Anyone"
Data tidak masuk ke Sheet Sheet ID salah atau nama tab berbeda Verifikasi SHEET_ID dan SHEET_NAME di script
Permission denied saat deploy Google memblokir Apps Script yang belum diverifikasi Klik "Advanced" → "Go to [project] (unsafe)" → Allow
Kategori selalu "Lainnya" Deskripsi tidak cocok dengan keyword di detectCategory() Tambahkan keyword baru di array categories
Angka jumlah tidak terformat Format cell bukan Number/Currency Select kolom D → Format → Number → Currency (Rp)
Webhook error 404 URL web app berubah setelah redeploy Jalankan setWebhook() ulang setiap kali redeploy

FAQ (Pertanyaan yang Sering Diajukan)

Apakah ini benar-benar gratis?

Ya, 100% gratis. Google Apps Script, Google Sheets, dan Telegram Bot API tidak dikenakan biaya untuk penggunaan personal. Limit Google Apps Script: 20,000 request/hari — lebih dari cukup untuk tracking pribadi.

Berapa lama waktu setup untuk pemula?

Sekitar 30-45 menit untuk pertama kali. Jika sudah familiar dengan Google Apps Script, bisa selesai dalam 15 menit.

Apakah data keuangan saya aman?

Ya, data tersimpan di Google Sheet pribadi kamu. Tips keamanan:

  • Aktifkan 2-Factor Authentication di Google Account
  • Jangan pernah membagikan BOT_TOKEN ke siapapun
  • Gunakan Private Google Sheet (bukan Shared publicly)

Bisakah digunakan untuk multiple user atau grup Telegram?

Bisa. Modifikasi script dengan menambahkan kolom User_ID di sheet Transaksi:

// Di fungsi saveToSheet, tambahkan:
sheet.appendRow([
  data.tanggal,
  data.kategori,
  data.deskripsi,
  data.jumlah,
  data.tipe,
  data.userId  // tambahan
]);

Apakah bisa digunakan di iPhone/Android?

Tentu! Bot Telegram berjalan di semua platform. Cukup buka Telegram app → cari bot kamu → chat pengeluaran. Dashboard bisa dilihat via Google Sheets mobile app.

Bisakah saya menambahkan foto struk/bukti transaksi?

Bisa dengan modifikasi. Gunakan message.photo di webhook dan simpan URL foto ke kolom baru di sheet. Atau integrasikan dengan Google Drive API untuk upload foto otomatis.


Tips & Pengembangan Lanjutan

1. Reminder Harian Otomatis

Tambahkan Trigger di Apps Script:

function createDailyReminder() {
  ScriptApp.newTrigger('sendDailyReminder')
    .timeBased()
    .everyDays(1)
    .atHour(20)  // Jam 8 malam
    .create();
}

function sendDailyReminder() {
  const chatId = [CHAT_ID_ANDA];
  sendMessage(chatId, '📅 Jangan lupa catat pengeluaran hari ini!');
}

2. Export Laporan Bulanan ke PDF

Gunakan Google Apps Script untuk auto-generate PDF dan kirim ke email:

function exportMonthlyReport() {
  const sheet = SpreadsheetApp.openById(SHEET_ID);
  const pdf = sheet.getAs('application/pdf');
  GmailApp.sendEmail('email@kamu.com', 'Laporan Bulanan', 'Terlampir.', {
    attachments: [pdf]
  });
}

3. Integrasi dengan Notion/Airtable

Gunakan Webhook atau Zapier untuk sinkronisasi data ke platform lain.

4. Voice Input (Chat Suara)

Telegram mendukung voice message. Tambahkan handler message.voice dan integrasikan dengan Google Speech-to-Text API.

5. AI Categorization dengan Gemini

Ganti detectCategory() dengan AI yang lebih cerdas menggunakan Google Gemini API:

function aiCategorize(description) {
  const apiKey = 'GEMINI_API_KEY';
  const url = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?key=' + apiKey;
  // ... call API untuk kategorisasi cerdas
}

Kesimpulan

Dengan mengikuti tutorial ini, kamu kini memiliki sistem tracking keuangan otomatis yang:

  • ✅ Gratis — tanpa biaya langganan bulanan
  • ✅ Cepat — input cukup via chat Telegram
  • ✅ Smart — kategori otomatis dari deskripsi
  • ✅ Visual — dashboard real-time di Google Sheet
  • ✅ Flexible — bisa dikembangkan sesuai kebutuhan

Sistem ini cocok untuk freelancer, mahasiswa, pegawai, atau siapapun yang ingin mengontrol pengeluaran tanpa ribet.

Aurealisa ID
Fakta Gambar (Science Fact), Kutipan (Quote Of The Day), Ulasan (Science Review), Tips, Artikel.

Komentar