Cara Balas WA Otomatis untuk E-commerce
Tutorial auto reply WhatsApp untuk e-commerce. Integrasi Shopee, Tokopedia, WooCommerce. Order notification otomatis!
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 recoveryDON'T ā
- Spam terlalu banyak notif
- Skip tracking info
- Generic tanpa personalisasi
- Forget review request
- Ignore marketplace orders
- No cart recoveryFAQ
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 Integration | Dengan WA Integration |
|---|---|
| Notif app saja | Multi-channel |
| Impersonal | Personal touch |
| No follow up | Auto follow up |
| Miss reviews | More reviews |
Setup E-commerce Integration ā