Cara Balas WA Otomatis untuk E-commerce

Tutorial auto reply WhatsApp untuk e-commerce. Integrasi Shopee, Tokopedia, WooCommerce. Order notification otomatis!

Cara Balas WA Otomatis untuk E-commerce
Cara Balas WA Otomatis untuk E-commerce

E-commerce + WhatsApp = Customer experience terbaik!

Integrasi auto reply dengan platform e-commerce membuat notifikasi order, update shipping, dan follow up semua otomatis.


E-commerce Flow dengan WhatsApp

šŸ“Š FLOW:

1. ORDER MASUK
   Shopee/Tokped/Website
   ↓
2. WEBHOOK TRIGGER
   Order data dikirim ke bot
   ↓
3. AUTO WA - KONFIRMASI
   "Terima kasih! Order #123 diterima"
   ↓
4. AUTO WA - PAYMENT
   "Pembayaran diterima, sedang diproses"
   ↓
5. AUTO WA - SHIPPING
   "Pesanan dikirim! Resi: XXX"
   ↓
6. AUTO WA - DELIVERED
   "Paket sampai! Jangan lupa review ya"

Integrasi WooCommerce

Webhook Setup:

php

// functions.php - WordPress/WooCommerce

// Trigger saat order baru
add_action('woocommerce_new_order', 'send_wa_new_order', 10, 1);

function send_wa_new_order($order_id) {
    $order = wc_get_order($order_id);
    
    $data = array(
        'order_id' => $order_id,
        'phone' => $order->get_billing_phone(),
        'name' => $order->get_billing_first_name(),
        'total' => $order->get_total(),
        'items' => array(),
        'status' => 'new'
    );
    
    foreach ($order->get_items() as $item) {
        $data['items'][] = array(
            'name' => $item->get_name(),
            'qty' => $item->get_quantity(),
            'price' => $item->get_total()
        );
    }
    
    // Kirim ke WhatsApp bot
    wp_remote_post('https://your-bot.com/webhook/woocommerce', array(
        'body' => json_encode($data),
        'headers' => array('Content-Type' => 'application/json')
    ));
}

// Trigger saat status berubah
add_action('woocommerce_order_status_changed', 'send_wa_status_change', 10, 4);

function send_wa_status_change($order_id, $old_status, $new_status, $order) {
    $data = array(
        'order_id' => $order_id,
        'phone' => $order->get_billing_phone(),
        'name' => $order->get_billing_first_name(),
        'old_status' => $old_status,
        'new_status' => $new_status
    );
    
    // Tambah resi jika shipping
    if ($new_status === 'completed' || $new_status === 'shipping') {
        $data['tracking'] = get_post_meta($order_id, '_tracking_number', true);
        $data['courier'] = get_post_meta($order_id, '_courier', true);
    }
    
    wp_remote_post('https://your-bot.com/webhook/woocommerce/status', array(
        'body' => json_encode($data),
        'headers' => array('Content-Type' => 'application/json')
    ));
}

Bot Handler:

javascript

// Handle WooCommerce webhook
app.post('/webhook/woocommerce', async (req, res) => {
    const order = req.body;
    
    // Format nomor Indonesia
    const phone = formatPhone(order.phone);
    
    // Kirim konfirmasi order
    const message = `
āœ… PESANAN DITERIMA!

Hai Kak ${order.name}!

Terima kasih sudah order di [BRAND]! šŸŽ‰

šŸ“¦ Order: #${order.order_id}
━━━━━━━━━━━━━━━━━━━━
${order.items.map(i => `• ${i.name} x${i.qty}`).join('\n')}
━━━━━━━━━━━━━━━━━━━━
šŸ’° Total: Rp ${formatNumber(order.total)}

Kami akan proses secepatnya!

Ada pertanyaan? Reply saja ya 😊
    `;
    
    await sendWhatsApp(phone, message);
    res.sendStatus(200);
});

// Handle status change
app.post('/webhook/woocommerce/status', async (req, res) => {
    const { order_id, phone, name, new_status, tracking, courier } = req.body;
    
    const formattedPhone = formatPhone(phone);
    let message;
    
    switch (new_status) {
        case 'processing':
            message = `šŸ“¦ Order #${order_id} sedang diproses!\n\nKami akan update saat pesanan dikirim ya kak.`;
            break;
            
        case 'shipping':
        case 'completed':
            message = `
🚚 PESANAN DIKIRIM!

Hai Kak ${name}!

Order #${order_id} sudah dalam perjalanan!

šŸ“¦ Kurir: ${courier}
šŸ“‹ Resi: ${tracking}

Track: ${getTrackingUrl(courier, tracking)}

Estimasi: 2-3 hari kerja

Ditunggu ya kak! šŸŽ‰
            `;
            break;
            
        case 'cancelled':
            message = `āŒ Order #${order_id} dibatalkan.\n\nAda yang bisa kami bantu kak?`;
            break;
    }
    
    if (message) {
        await sendWhatsApp(formattedPhone, message);
    }
    
    res.sendStatus(200);
});

Integrasi Shopee

Shopee Open API:

javascript

const crypto = require('crypto');

class ShopeeAPI {
    constructor(partnerId, partnerKey, shopId, accessToken) {
        this.partnerId = partnerId;
        this.partnerKey = partnerKey;
        this.shopId = shopId;
        this.accessToken = accessToken;
        this.baseUrl = 'https://partner.shopeemobile.com';
    }
    
    generateSignature(path, timestamp) {
        const baseString = `${this.partnerId}${path}${timestamp}${this.accessToken}${this.shopId}`;
        return crypto.createHmac('sha256', this.partnerKey)
            .update(baseString)
            .digest('hex');
    }
    
    async getOrderDetail(orderSn) {
        const path = '/api/v2/order/get_order_detail';
        const timestamp = Math.floor(Date.now() / 1000);
        const sign = this.generateSignature(path, timestamp);
        
        const response = await axios.get(`${this.baseUrl}${path}`, {
            params: {
                partner_id: this.partnerId,
                timestamp,
                sign,
                shop_id: this.shopId,
                access_token: this.accessToken,
                order_sn_list: orderSn
            }
        });
        
        return response.data.response.order_list[0];
    }
}

// Handle Shopee webhook
app.post('/webhook/shopee', async (req, res) => {
    const { code, data } = req.body;
    
    // code 3 = order status update
    if (code === 3) {
        const orderSn = data.ordersn;
        const status = data.status;
        
        // Get full order detail
        const order = await shopee.getOrderDetail(orderSn);
        const phone = order.recipient_address.phone;
        const name = order.recipient_address.name;
        
        // Send WhatsApp based on status
        await handleShopeeStatus(phone, name, orderSn, status, order);
    }
    
    res.sendStatus(200);
});

async function handleShopeeStatus(phone, name, orderSn, status, order) {
    let message;
    
    switch (status) {
        case 'READY_TO_SHIP':
            message = `šŸ“¦ Pesanan Shopee #${orderSn.slice(-8)} sedang disiapkan!`;
            break;
            
        case 'SHIPPED':
            message = `
🚚 PESANAN SHOPEE DIKIRIM!

Hai Kak ${name}!

Pesanan dari Shopee sudah dikirim:

šŸ“¦ Order: #${orderSn.slice(-8)}
🚚 Kurir: ${order.shipping_carrier}
šŸ“‹ Resi: ${order.tracking_no}

Track di aplikasi Shopee ya kak!
            `;
            break;
            
        case 'COMPLETED':
            message = `
āœ… PESANAN SAMPAI!

Hai Kak ${name}!

Pesanan #${orderSn.slice(-8)} sudah diterima šŸŽ‰

Jangan lupa kasih rating & review 
di Shopee ya kak! ⭐⭐⭐⭐⭐

Terima kasih sudah belanja! šŸ’•
            `;
            break;
    }
    
    if (message) {
        await sendWhatsApp(formatPhone(phone), message);
    }
}

Integrasi Tokopedia

Tokopedia Webhook:

javascript

// Tokopedia uses webhook for order notifications
app.post('/webhook/tokopedia', async (req, res) => {
    // Verify signature
    const signature = req.headers['x-tokopedia-signature'];
    if (!verifyTokopediaSignature(req.body, signature)) {
        return res.status(401).send('Invalid signature');
    }
    
    const { type, data } = req.body;
    
    if (type === 'ORDER_STATUS_CHANGE') {
        const { order_id, order_status, buyer } = data;
        
        await handleTokopediaStatus(
            buyer.phone,
            buyer.name,
            order_id,
            order_status,
            data
        );
    }
    
    res.sendStatus(200);
});

async function handleTokopediaStatus(phone, name, orderId, status, data) {
    let message;
    
    switch (status) {
        case 220: // Payment verified
            message = `āœ… Pembayaran Tokopedia #${orderId} diterima! Sedang diproses.`;
            break;
            
        case 400: // Shipped
            message = `
🚚 PESANAN TOKOPEDIA DIKIRIM!

Hai Kak ${name}!

šŸ“¦ Order: #${orderId}
🚚 Kurir: ${data.shipping.courier}
šŸ“‹ Resi: ${data.shipping.awb}

Track di aplikasi Tokopedia ya!
            `;
            break;
            
        case 700: // Completed
            message = `
āœ… PESANAN SAMPAI!

Hai Kak ${name}!

Order #${orderId} sudah diterima šŸŽ‰

Puas dengan pesanannya?
Jangan lupa review di Tokopedia ya! ⭐

Terima kasih! šŸ’•
            `;
            break;
    }
    
    if (message) {
        await sendWhatsApp(formatPhone(phone), message);
    }
}

Template Messages

Order Confirmation:

āœ… PESANAN DITERIMA!

Hai Kak [NAMA]!

Terima kasih sudah order! šŸŽ‰

šŸ“¦ Order: #[ORDER_ID]
šŸ“ Platform: [SHOPEE/TOKPED/WEBSITE]
━━━━━━━━━━━━━━━━━━━━
[ITEM LIST]
━━━━━━━━━━━━━━━━━━━━
šŸ’° Total: Rp [TOTAL]

Status: Menunggu pembayaran

ā° Bayar sebelum: [DEADLINE]

Ada pertanyaan? Reply saja! 😊

Payment Received:

šŸ’³ PEMBAYARAN DITERIMA!

Hai Kak [NAMA]!

Pembayaran order #[ORDER_ID] sudah kami terima āœ…

Pesanan sedang diproses dan akan 
dikirim dalam 1-2 hari kerja.

Kami akan kabari saat pesanan dikirim ya!

Terima kasih šŸ™

Shipping Notification:

🚚 PESANAN DIKIRIM!

Hai Kak [NAMA]!

Order #[ORDER_ID] sudah berangkat! šŸ“¦

━━━━━━━━━━━━━━━━━━━━
🚚 Kurir: [COURIER]
šŸ“‹ Resi: [TRACKING]
šŸ“… Estimasi: [ETA]
━━━━━━━━━━━━━━━━━━━━

Track: [TRACKING_URL]

Ditunggu ya kak! šŸŽ‰

Delivery Confirmation:

āœ… PAKET SAMPAI!

Hai Kak [NAMA]!

Yeay, pesanan sudah diterima! šŸŽ‰

Gimana produknya? Semoga puas ya!

šŸ™ Minta tolong dong kak:
   Kasih review di [PLATFORM] ya!
   ⭐⭐⭐⭐⭐

Bintang 5 dari kakak sangat 
berarti untuk toko kami šŸ’•

Terima kasih sudah belanja!

Abandoned Cart Recovery

javascript

// Check abandoned carts daily
cron.schedule('0 10 * * *', async () => {
    // Get carts abandoned > 1 hour
    const abandonedCarts = await db.carts.find({
        status: 'abandoned',
        updatedAt: { $lt: hoursAgo(1) },
        reminderSent: { $ne: true }
    });
    
    for (const cart of abandonedCarts) {
        const message = `
šŸ›’ KERANJANG MENUNGGU!

Hai Kak ${cart.customerName}!

Ada barang di keranjang yang belum checkout nih:

${cart.items.map(i => `• ${i.name}`).join('\n')}

šŸ’° Total: Rp ${formatNumber(cart.total)}

šŸŽ KHUSUS HARI INI:
   Diskon 10% dengan kode: CHECKOUT10

Yuk checkout sekarang! šŸ‘‡
[LINK]
        `;
        
        await sendWhatsApp(cart.phone, message);
        await db.carts.updateOne(
            { _id: cart._id },
            { $set: { reminderSent: true } }
        );
    }
});

Multi-Platform Dashboard

javascript

// Unified order tracking
async function getUnifiedOrders(phone) {
    const orders = [];
    
    // WooCommerce orders
    const wooOrders = await woocommerce.getOrdersByPhone(phone);
    orders.push(...wooOrders.map(o => ({
        ...o,
        platform: 'website'
    })));
    
    // Shopee orders (if linked)
    const shopeeOrders = await shopee.getOrdersByPhone(phone);
    orders.push(...shopeeOrders.map(o => ({
        ...o,
        platform: 'shopee'
    })));
    
    // Tokopedia orders (if linked)
    const tokpedOrders = await tokopedia.getOrdersByPhone(phone);
    orders.push(...tokpedOrders.map(o => ({
        ...o,
        platform: 'tokopedia'
    })));
    
    return orders.sort((a, b) => b.createdAt - a.createdAt);
}

// Customer asks for order status
async function handleOrderStatusRequest(phone, message) {
    const orders = await getUnifiedOrders(phone);
    
    if (orders.length === 0) {
        return 'Belum ada pesanan dengan nomor HP ini kak.';
    }
    
    const recentOrders = orders.slice(0, 3);
    
    return `
šŸ“¦ PESANAN TERBARU

${recentOrders.map(o => `
#${o.orderId} (${o.platform})
Status: ${o.status}
Total: Rp ${formatNumber(o.total)}
`).join('\n━━━━━━━━━━━━━━━━━━━━\n')}

Ketik nomor order untuk detail lebih lengkap!
    `;
}

Best Practices

DO āœ…

- Kirim di setiap milestone
- Include tracking link
- Personalisasi dengan nama
- Minta review setelah delivered
- Handle multi-platform
- Abandoned cart recovery

DON'T āŒ

- Spam terlalu banyak notif
- Skip tracking info
- Generic tanpa personalisasi
- Forget review request
- Ignore marketplace orders
- No cart recovery

FAQ

Platform mana yang paling mudah diintegrasikan?

WooCommerce karena full control. Marketplace (Shopee/Tokped) butuh approval API.

Perlu kirim WA juga kalau sudah ada notif dari marketplace?

Ya! WA lebih personal dan open rate lebih tinggi dari notif app.


Kesimpulan

E-commerce + WA = Complete experience!

Tanpa WA IntegrationDengan WA Integration
Notif app sajaMulti-channel
ImpersonalPersonal touch
No follow upAuto follow up
Miss reviewsMore reviews

Setup E-commerce Integration →


Artikel Terkait