Bot Jualan dengan Analytics & Reporting
Cara buat bot jualan WhatsApp dengan analytics dan reporting. Sales dashboard, insights, data-driven decisions. Panduan lengkap!
Data = Keputusan yang lebih baik!
Bot jualan yang dilengkapi analytics membantu kamu track performance, identify trends, dan optimize strategi penjualan.
Metrics yang Perlu Ditrack
📊 KEY METRICS:
SALES METRICS:
- Total revenue
- Number of orders
- Average order value (AOV)
- Conversion rate
- Sales by product/category
CUSTOMER METRICS:
- New vs returning
- Customer lifetime value (CLV)
- Repeat purchase rate
- Churn rate
OPERATIONAL METRICS:
- Response time
- Resolution rate
- Cart abandonment
- Popular products
- Peak hoursDaily Report Template
📊 LAPORAN HARIAN
Tanggal: 17 Februari 2026
💰 PENJUALAN:
━━━━━━━━━━━━━━━━━━━━
Total Revenue: Rp 15.750.000
Orders: 45 pesanan
AOV: Rp 350.000
vs Kemarin:
Revenue: ↑ +12%
Orders: ↑ +8%
AOV: ↑ +4%
📦 TOP PRODUCTS:
1. Produk A - 18 pcs (Rp 5.4jt)
2. Produk B - 12 pcs (Rp 4.2jt)
3. Produk C - 8 pcs (Rp 3.2jt)
👥 CUSTOMERS:
New: 28 (62%)
Returning: 17 (38%)
⏰ PEAK HOURS:
19:00-21:00 (35% orders)
📱 CHAT STATS:
Total chats: 156
Converted: 45 (29%)
Abandoned: 23 (15%)
FAQ only: 88 (56%)Weekly Report:
📊 LAPORAN MINGGUAN
Periode: 11-17 Feb 2026
💰 RINGKASAN PENJUALAN:
━━━━━━━━━━━━━━━━━━━━
Total Revenue: Rp 89.500.000
Total Orders: 287
Average Daily: Rp 12.8jt
AOV: Rp 312.000
📈 TREND HARIAN:
Sen: Rp 10.2jt ████████░░
Sel: Rp 11.5jt █████████░
Rab: Rp 12.3jt ██████████
Kam: Rp 11.8jt █████████░
Jum: Rp 14.2jt ███████████
Sab: Rp 17.3jt █████████████
Min: Rp 12.2jt ██████████
🏆 BEST DAY: Sabtu (Rp 17.3jt)
📦 TOP 5 PRODUCTS:
1. Produk A - 85 pcs (Rp 25.5jt)
2. Produk B - 62 pcs (Rp 21.7jt)
3. Produk C - 48 pcs (Rp 19.2jt)
4. Produk D - 35 pcs (Rp 10.5jt)
5. Produk E - 28 pcs (Rp 8.4jt)
📉 SLOW MOVERS:
- Produk X - 2 pcs
- Produk Y - 3 pcs
👥 CUSTOMER INSIGHTS:
New Customers: 180 (63%)
Returning: 107 (37%)
Repeat Rate: 37%
💳 PAYMENT METHODS:
Transfer: 45%
E-Wallet: 35%
COD: 20%
🚚 SHIPPING:
JNE: 52%
J&T: 31%
SiCepat: 17%Monthly Report:
📊 LAPORAN BULANAN
Periode: Januari 2026
💰 HIGHLIGHTS:
━━━━━━━━━━━━━━━━━━━━
Revenue: Rp 385.000.000
Orders: 1,234
AOV: Rp 312.000
Growth: +18% vs Dec
🎯 TARGET vs ACTUAL:
Target: Rp 350.000.000
Actual: Rp 385.000.000
Achievement: 110% ✅
📊 WEEKLY BREAKDOWN:
Week 1: Rp 82jt
Week 2: Rp 95jt (promo)
Week 3: Rp 98jt
Week 4: Rp 110jt (payday)
📦 CATEGORY PERFORMANCE:
Category A: 42% (Rp 162jt)
Category B: 35% (Rp 135jt)
Category C: 23% (Rp 88jt)
👥 CUSTOMER ANALYSIS:
Total Customers: 856
New: 612 (71%)
Returning: 244 (29%)
CLV Average: Rp 1.2jt
🔄 REPEAT PURCHASE:
1x buyer: 612
2x buyer: 156
3x+ buyer: 88
📱 CONVERSION FUNNEL:
Chat initiated: 4,521
Product viewed: 3,215 (71%)
Add to cart: 1,856 (41%)
Checkout: 1,456 (32%)
Paid: 1,234 (27%)
❌ ABANDONED CARTS: 222
Recovery rate: 45 (20%)Real-time Dashboard
📊 LIVE DASHBOARD
🕐 Last updated: 14:35 WIB
TODAY SO FAR:
━━━━━━━━━━━━━━━━━━━━
Revenue: Rp 8.250.000
Orders: 24
AOV: Rp 343.750
Target hari ini: Rp 15.000.000
Progress: ████████░░░░░░░ 55%
🔴 LIVE ACTIVITY:
- 14:33 - Order #456 confirmed
- 14:31 - New chat from +62812xxx
- 14:28 - Payment received #455
- 14:25 - Cart abandoned +62813xxx
📦 LOW STOCK ALERT:
- Produk A: 5 pcs left!
- Produk B: 8 pcs left!
⏰ CURRENT HOUR:
14:00-15:00: 3 orders (Rp 1.2jt)
vs same hour yesterday: +2 orders
👥 ACTIVE CHATS: 12
Waiting response: 3Implementation
Data Collection:
javascript
// Track every event
async function trackEvent(eventType, data) {
await db.analytics.insert({
type: eventType,
data,
timestamp: new Date(),
date: new Date().toISOString().split('T')[0]
});
}
// Events to track
const events = {
CHAT_STARTED: 'chat_started',
PRODUCT_VIEWED: 'product_viewed',
ADD_TO_CART: 'add_to_cart',
CHECKOUT_STARTED: 'checkout_started',
ORDER_PLACED: 'order_placed',
PAYMENT_RECEIVED: 'payment_received',
CART_ABANDONED: 'cart_abandoned'
};
// Usage
await trackEvent(events.ORDER_PLACED, {
orderId: order.id,
customerId: customer.id,
products: order.items,
total: order.total,
isNewCustomer: customer.orderCount === 1
});Generate Reports:
javascript
async function generateDailyReport(date) {
const startOfDay = new Date(date);
startOfDay.setHours(0, 0, 0, 0);
const endOfDay = new Date(date);
endOfDay.setHours(23, 59, 59, 999);
const orders = await db.orders.find({
createdAt: { $gte: startOfDay, $lte: endOfDay },
status: { $in: ['paid', 'completed'] }
});
const revenue = orders.reduce((sum, o) => sum + o.total, 0);
const aov = orders.length > 0 ? revenue / orders.length : 0;
// Product breakdown
const productSales = {};
for (const order of orders) {
for (const item of order.items) {
if (!productSales[item.productId]) {
productSales[item.productId] = { qty: 0, revenue: 0 };
}
productSales[item.productId].qty += item.quantity;
productSales[item.productId].revenue += item.price * item.quantity;
}
}
// New vs returning
const customerIds = [...new Set(orders.map(o => o.customerId))];
const newCustomers = await db.customers.count({
_id: { $in: customerIds },
firstOrderDate: { $gte: startOfDay }
});
// Compare with yesterday
const yesterday = new Date(date);
yesterday.setDate(yesterday.getDate() - 1);
const yesterdayReport = await getReportData(yesterday);
return {
date,
revenue,
orders: orders.length,
aov,
topProducts: Object.entries(productSales)
.sort((a, b) => b[1].revenue - a[1].revenue)
.slice(0, 5),
customers: {
total: customerIds.length,
new: newCustomers,
returning: customerIds.length - newCustomers
},
comparison: {
revenue: ((revenue - yesterdayReport.revenue) / yesterdayReport.revenue * 100).toFixed(1),
orders: ((orders.length - yesterdayReport.orders) / yesterdayReport.orders * 100).toFixed(1)
}
};
}Auto-Send Reports:
javascript
// Daily report at 23:00
cron.schedule('0 23 * * *', async () => {
const report = await generateDailyReport(new Date());
const message = formatDailyReport(report);
// Send to owner
await sendMessage(OWNER_PHONE, message);
});
// Weekly report every Monday 09:00
cron.schedule('0 9 * * 1', async () => {
const report = await generateWeeklyReport();
const message = formatWeeklyReport(report);
await sendMessage(OWNER_PHONE, message);
});
// Monthly report on 1st of month
cron.schedule('0 9 1 * *', async () => {
const lastMonth = new Date();
lastMonth.setMonth(lastMonth.getMonth() - 1);
const report = await generateMonthlyReport(lastMonth);
const message = formatMonthlyReport(report);
await sendMessage(OWNER_PHONE, message);
});Actionable Insights
Smart Alerts:
⚠️ INSIGHTS & ALERTS
🔴 URGENT:
- Produk A hampir habis (5 pcs)
- Cart abandonment naik 25% hari ini
- Response time > 5 menit (3 chats)
🟡 ATTENTION:
- Produk X tidak ada order 7 hari
- AOV turun 10% vs minggu lalu
- New customer rate turun 5%
🟢 POSITIVE:
- Revenue +18% vs kemarin
- Repeat purchase rate naik 3%
- Best selling: Produk B (+45%)
💡 RECOMMENDATIONS:
- Restock Produk A segera
- Follow up 5 abandoned carts
- Promo untuk Produk XBest Practices
DO ✅
- Track consistently
- Daily review minimum
- Act on insights
- Compare periods
- Set targets
- Share with teamDON'T ❌
- Track without acting
- Ignore negative trends
- Vanity metrics only
- No historical comparison
- Overwhelm with data
- Manual trackingFAQ
Metrics mana yang paling penting?
Revenue, conversion rate, dan repeat purchase rate. Ini langsung impact business.
Berapa sering lihat report?
Daily untuk monitoring, weekly untuk strategy. Monthly untuk big picture.
Perlu tools analytics terpisah?
Start dengan built-in, scale ke dedicated tools (Metabase, etc) seiring growth.
Kesimpulan
Data-driven = Smarter decisions!
| No Analytics | With Analytics |
|---|---|
| Guessing | Data-driven |
| Reactive | Proactive |
| Blind spots | Full visibility |
| Slow adapt | Quick pivot |