Cara Balas WA Otomatis untuk Customer Service

Tutorial auto reply WhatsApp untuk customer service. FAQ otomatis, ticket system, escalation. Panduan lengkap CS automation!

Cara Balas WA Otomatis untuk Customer Service
Cara Balas WA Otomatis untuk Customer Service

CS automation = Happy customers + Happy team!

Auto reply untuk customer service bukan mengganti manusia, tapi membantu handle pertanyaan umum agar tim bisa fokus ke yang kompleks.


CS Automation Flow

📊 FLOW IDEAL:

TIER 1 - BOT (Otomatis):
- Greeting & menu
- FAQ umum
- Status order
- Info produk basic
→ Solve 60-70% inquiries

TIER 2 - AGENT (Semi-manual):
- Pertanyaan spesifik
- Komplain ringan
- Custom requests
→ Handle 20-25%

TIER 3 - SUPERVISOR (Manual):
- Komplain berat
- Refund/return
- Escalation
→ Handle 5-10%

Setup CS Auto Reply

📞 CUSTOMER SERVICE [BRAND]

Hai Kak [NAMA]! 👋
Ada yang bisa kami bantu?

Pilih topik:

1️⃣ Cek Status Pesanan
2️⃣ Informasi Produk
3️⃣ Pengiriman & Ongkir
4️⃣ Pembayaran
5️⃣ Komplain/Retur
6️⃣ Pertanyaan Lain

Ketik angka atau langsung ceritakan
masalahmu ya kak! 😊

⏰ CS Online: 09:00-21:00 WIB
📦 CEK STATUS PESANAN

Untuk cek pesanan, kirim:

No. Order (contoh: ORD-123456)

ATAU

No. HP yang dipakai saat order

Kami akan carikan info pesananmu! 🔍

Response Status Pesanan:

📦 STATUS PESANAN

Order: #ORD-123456

📊 Status: DALAM PENGIRIMAN

📋 Detail:
━━━━━━━━━━━━━━━━━━━━
📅 Order: 15 Feb 2026
📦 Produk: Facial Wash x 2
💰 Total: Rp 178.000
━━━━━━━━━━━━━━━━━━━━

🚚 Pengiriman:
Kurir: JNE REG
Resi: 1234567890
Status: Di perjalanan

📅 Estimasi tiba: 18-19 Feb 2026

Track: jne.co.id/track/1234567890

Ada pertanyaan lain? 😊

FAQ Automation

FAQ Database:

javascript

const faqDatabase = [
    {
        keywords: ['berapa lama', 'estimasi', 'kapan sampai', 'pengiriman'],
        category: 'shipping',
        answer: `🚚 ESTIMASI PENGIRIMAN

Jabodetabek: 1-2 hari
Jawa: 2-3 hari
Luar Jawa: 3-5 hari
Indonesia Timur: 5-7 hari

*Tergantung kurir yang dipilih dan kondisi.`
    },
    {
        keywords: ['cara bayar', 'pembayaran', 'transfer', 'rekening'],
        category: 'payment',
        answer: `💳 METODE PEMBAYARAN

1. Transfer Bank:
   • BCA: 1234567890
   • Mandiri: 0987654321
   a.n. PT [BRAND]

2. E-Wallet:
   • GoPay
   • OVO
   • DANA

3. Virtual Account (otomatis)

Setelah bayar, kirim bukti ya!`
    },
    {
        keywords: ['retur', 'return', 'tukar', 'kembalikan'],
        category: 'return',
        answer: `🔄 KEBIJAKAN RETUR

Retur diterima jika:
✅ Produk cacat/rusak dari kami
✅ Produk tidak sesuai pesanan
✅ Lapor dalam 3x24 jam

Caranya:
1. Foto produk & kemasan
2. Kirim ke CS dengan no order
3. Tunggu konfirmasi
4. Kirim balik (ongkir kami tanggung)

Ada yang mau di-retur kak?`
    }
];

function findFAQAnswer(message) {
    const lowerMessage = message.toLowerCase();
    
    for (const faq of faqDatabase) {
        const matchCount = faq.keywords.filter(k => 
            lowerMessage.includes(k)
        ).length;
        
        if (matchCount >= 1) {
            return faq.answer;
        }
    }
    
    return null;
}

Ticket System

Create Ticket Otomatis:

javascript

async function createTicket(customerId, category, message) {
    const ticket = {
        id: generateTicketId(),
        customerId,
        category,
        message,
        status: 'open',
        priority: determinePriority(category, message),
        createdAt: new Date(),
        assignedTo: null
    };
    
    await db.tickets.insertOne(ticket);
    
    // Auto-assign based on category
    await autoAssignTicket(ticket);
    
    return ticket;
}

function determinePriority(category, message) {
    // High priority keywords
    const urgentKeywords = ['urgent', 'segera', 'darurat', 'refund', 'hilang'];
    const isUrgent = urgentKeywords.some(k => 
        message.toLowerCase().includes(k)
    );
    
    if (isUrgent) return 'high';
    if (category === 'complaint') return 'medium';
    return 'normal';
}

Ticket Confirmation:

🎫 TIKET DIBUAT

Hai Kak [NAMA],

Pertanyaanmu sudah kami terima!

📋 No. Tiket: #CS-20260217-001
📂 Kategori: [KATEGORI]
⏰ Dibuat: 17 Feb 2026, 14:30

Tim kami akan merespons dalam:
- Normal: 1-2 jam
- High priority: 30 menit

💡 Tips:
Sebutkan no tiket jika follow up ya!

Terima kasih kesabarannya 🙏

Escalation Flow

Auto Escalation:

javascript

async function handleMessage(from, message) {
    // Check for escalation triggers
    if (shouldEscalate(message)) {
        return await escalateToHuman(from, message);
    }
    
    // Try FAQ first
    const faqAnswer = findFAQAnswer(message);
    if (faqAnswer) {
        return await sendMessage(from, faqAnswer);
    }
    
    // Try order status
    const orderNumber = extractOrderNumber(message);
    if (orderNumber) {
        const status = await getOrderStatus(orderNumber);
        return await sendMessage(from, formatOrderStatus(status));
    }
    
    // No match - offer menu or escalate
    return await sendMessage(from, getDefaultMenu());
}

function shouldEscalate(message) {
    const escalationTriggers = [
        'bicara dengan manusia',
        'mau komplain',
        'cs manusia',
        'operator',
        'manager',
        'sangat kecewa',
        'tidak terima',
        'mau refund'
    ];
    
    const lowerMessage = message.toLowerCase();
    return escalationTriggers.some(t => lowerMessage.includes(t));
}

async function escalateToHuman(from, message) {
    // Create high priority ticket
    const ticket = await createTicket(from, 'escalation', message);
    
    // Notify available agent
    await notifyAgents(ticket);
    
    // Inform customer
    return await sendMessage(from, `
🙋 MENGHUBUNGKAN KE TIM KAMI

Hai kak, kami paham kakak butuh 
bantuan lebih lanjut.

Tiket: #${ticket.id}

Tim kami akan menghubungi dalam 
5-10 menit.

Mohon tunggu ya kak 🙏
    `);
}

Working Hours Handling

Office Hours Check:

javascript

function isWithinWorkingHours() {
    const now = new Date();
    const hour = now.getHours();
    const day = now.getDay();
    
    // Senin-Sabtu, 09:00-21:00
    if (day === 0) return false; // Minggu libur
    if (hour < 9 || hour >= 21) return false;
    
    return true;
}

async function handleOutOfHours(from, message) {
    // Simpan pesan untuk follow up
    await saveForFollowUp(from, message);
    
    return await sendMessage(from, `
⏰ DI LUAR JAM OPERASIONAL

Hai kak! Saat ini di luar jam kerja.

Jam CS Online:
Senin-Sabtu: 09:00-21:00 WIB

Pertanyaanmu sudah kami catat dan akan
direspons begitu CS online.

📋 Sementara, coba cek:
1️⃣ FAQ - ketik FAQ
2️⃣ Status Order - ketik CEK [NO ORDER]

Atau tunggu balasan dari tim kami ya!
    `);
}

Agent Dashboard Integration

Notify Agent:

javascript

// Kirim notifikasi ke agent via dashboard/app
async function notifyAgents(ticket) {
    const availableAgents = await getAvailableAgents(ticket.category);
    
    for (const agent of availableAgents) {
        // Push notification
        await sendPushNotification(agent.id, {
            title: 'New Ticket',
            body: `#${ticket.id} - ${ticket.category}`,
            data: ticket
        });
        
        // In-app notification
        await createNotification(agent.id, ticket);
    }
    
    // Also send to dashboard WebSocket
    io.to('agents').emit('new-ticket', ticket);
}

// Agent claim ticket
async function claimTicket(agentId, ticketId) {
    await db.tickets.updateOne(
        { id: ticketId, assignedTo: null },
        { 
            $set: { 
                assignedTo: agentId,
                status: 'in_progress',
                claimedAt: new Date()
            }
        }
    );
    
    // Notify customer
    const ticket = await db.tickets.findOne({ id: ticketId });
    await sendMessage(ticket.customerId, `
✅ TIM KAMI SIAP MEMBANTU

Hai kak!

[NAMA AGENT] dari tim CS akan 
membantu kakak.

Silakan sampaikan keluhannya ya!
    `);
}

Metrics & Reporting

javascript

async function getCSMetrics(startDate, endDate) {
    const tickets = await db.tickets.find({
        createdAt: { $gte: startDate, $lte: endDate }
    }).toArray();
    
    // First response time
    const avgFirstResponse = calculateAvgFirstResponse(tickets);
    
    // Resolution time
    const avgResolution = calculateAvgResolution(tickets);
    
    // Bot resolution rate
    const botResolved = tickets.filter(t => t.resolvedBy === 'bot').length;
    const botResolutionRate = (botResolved / tickets.length * 100).toFixed(1);
    
    // By category
    const byCategory = groupBy(tickets, 'category');
    
    return {
        totalTickets: tickets.length,
        avgFirstResponse: `${avgFirstResponse} menit`,
        avgResolution: `${avgResolution} jam`,
        botResolutionRate: `${botResolutionRate}%`,
        byCategory,
        satisfactionScore: await getCSAT(startDate, endDate)
    };
}

Best Practices

DO ✅

- Bot handle FAQ, manusia handle kompleks
- Clear escalation path
- Quick first response
- Track semua metrics
- Regular FAQ update
- Follow up setelah resolved

DON'T ❌

- Force bot untuk semua
- No human fallback
- Slow escalation
- Ignore metrics
- Stale FAQ
- No closure/follow up

FAQ

Berapa persen yang bisa di-automate?

60-70% inquiries bisa handle bot untuk FAQ, status order, info umum.

Customer tidak suka bot?

Yang penting solve masalah. Bot yang helpful lebih baik dari manusia yang slow.

Perlu berapa agent?

Tergantung volume. Rule of thumb: 1 agent untuk 50-100 daily conversations.


Kesimpulan

CS automation = Efficiency + Quality!

Full ManualSmart Automation
Slow responseInstant for FAQ
Overwhelmed agentsFocused agents
InconsistentConsistent
ExpensiveCost-effective

Setup CS Automation →


Artikel Terkait