Bot WA AI untuk Product Recommendation
Cara membuat bot AI WhatsApp untuk rekomendasi produk. Personalisasi, upsell, cross-sell otomatis. Tutorial lengkap!
AI recommendation = Personal shopping assistant!
Bot AI bisa pahami kebutuhan, rekomendasikan produk tepat, dan upsell/cross-sell secara natural - seperti sales terbaik kamu.
Jenis Recommendation
📊 TIPE REKOMENDASI:
1. NEED-BASED
"Mau cari baju kondangan"
→ Rekomendasikan dress formal
2. PREFERENCE-BASED
"Suka warna pastel"
→ Filter produk warna pastel
3. HISTORY-BASED
Pernah beli skincare
→ Rekomendasikan skincare lain
4. COLLABORATIVE
"Customer serupa juga beli..."
→ Based on similar users
5. UPSELL
Pilih produk A
→ "Ada versi premium lho!"
6. CROSS-SELL
Beli dress
→ "Cocok dipadukan dengan..."Product Catalog Structure
javascript
const productSchema = {
id: String,
name: String,
category: String,
subcategory: String,
price: Number,
description: String,
features: [String],
tags: [String], // ["casual", "formal", "summer"]
colors: [String],
sizes: [String],
occasions: [String], // ["kondangan", "kerja", "casual"]
targetAudience: String, // "wanita dewasa", "remaja"
relatedProducts: [String], // IDs for cross-sell
premiumVersion: String, // ID for upsell
rating: Number,
reviewCount: Number,
stock: Number,
imageUrl: String
};
// Example
const products = [
{
id: 'dress-001',
name: 'Dress Brukat Elegan',
category: 'dress',
subcategory: 'formal',
price: 350000,
description: 'Dress brukat dengan detail elegan, cocok untuk acara formal',
features: ['Bahan brukat premium', 'Furing dalam', 'Resleting belakang'],
tags: ['formal', 'elegan', 'brukat', 'kondangan'],
colors: ['navy', 'maroon', 'black'],
sizes: ['S', 'M', 'L', 'XL'],
occasions: ['kondangan', 'pesta', 'wisuda'],
relatedProducts: ['clutch-001', 'heels-001'],
premiumVersion: 'dress-001-premium',
rating: 4.8,
reviewCount: 156
}
];AI Recommendation System
System Prompt:
javascript
const RECOMMENDATION_PROMPT = `Kamu adalah personal shopping assistant AI untuk [BRAND].
TUGAS:
1. Pahami kebutuhan customer
2. Tanya detail jika perlu (occasion, budget, preference)
3. Rekomendasikan 2-3 produk yang paling cocok
4. Jelaskan kenapa produk itu cocok
5. Tawarkan cross-sell yang relevan
PRODUCT CATALOG:
{CATALOG_JSON}
CARA MEREKOMENDASIKAN:
- Match occasion dengan product.occasions
- Match budget dengan price range
- Match style preference dengan tags
- Prioritaskan rating tinggi
- Sebutkan harga dan keunggulan
FORMAT REKOMENDASI:
"Berdasarkan kebutuhan kakak, aku rekomendasikan:
1️⃣ [Nama Produk]
💰 Rp [Harga]
✨ [Alasan cocok]
2️⃣ [Nama Produk]
💰 Rp [Harga]
✨ [Alasan cocok]
Mau lihat detail yang mana kak?"
UPSELL (jika ada premium version):
"Btw, ada juga versi premium dengan [fitur tambahan]
cuma selisih Rp [X] lho kak!"
CROSS-SELL (setelah pilih):
"Dress ini cocok banget dipadukan dengan [related product]!"`;Recommendation Engine:
javascript
async function getProductRecommendations(userContext) {
const {
occasion,
budget,
preferences,
previousPurchases,
currentCart
} = userContext;
// 1. Filter by basic criteria
let candidates = await db.products.find({
stock: { $gt: 0 },
...(occasion && { occasions: occasion }),
...(budget && { price: { $lte: budget } })
}).toArray();
// 2. Score each product
const scoredProducts = candidates.map(product => {
let score = 0;
// Preference match
if (preferences?.colors) {
const colorMatch = product.colors.some(c =>
preferences.colors.includes(c)
);
if (colorMatch) score += 20;
}
if (preferences?.style) {
const styleMatch = product.tags.some(t =>
preferences.style.includes(t)
);
if (styleMatch) score += 15;
}
// Rating boost
score += product.rating * 10;
// Popularity boost
score += Math.min(product.reviewCount / 10, 20);
// Budget fit (prefer products that use 60-80% of budget)
if (budget) {
const budgetRatio = product.price / budget;
if (budgetRatio >= 0.6 && budgetRatio <= 0.8) {
score += 15;
}
}
// Avoid already purchased
if (previousPurchases?.includes(product.id)) {
score -= 50;
}
return { ...product, score };
});
// 3. Sort by score and return top N
scoredProducts.sort((a, b) => b.score - a.score);
return scoredProducts.slice(0, 5);
}
// Get cross-sell recommendations
async function getCrossSellProducts(productId, limit = 3) {
const product = await db.products.findOne({ id: productId });
if (product?.relatedProducts?.length) {
return await db.products.find({
id: { $in: product.relatedProducts }
}).limit(limit).toArray();
}
// Fallback: similar category
return await db.products.find({
category: product.category,
id: { $ne: productId }
}).sort({ rating: -1 }).limit(limit).toArray();
}
// Get upsell product
async function getUpsellProduct(productId) {
const product = await db.products.findOne({ id: productId });
if (product?.premiumVersion) {
return await db.products.findOne({ id: product.premiumVersion });
}
// Fallback: higher-priced in same category
return await db.products.findOne({
category: product.category,
price: { $gt: product.price },
id: { $ne: productId }
});
}Conversational Recommendation
javascript
async function handleRecommendationChat(userId, userMessage, context) {
const userContext = await getUserContext(userId);
// Build prompt with context
const recommendations = await getProductRecommendations(userContext);
const productContext = recommendations.map(p =>
`- ${p.name}: Rp ${p.price.toLocaleString()}, ${p.tags.join(', ')}, rating ${p.rating}`
).join('\n');
const response = await openai.chat.completions.create({
model: 'gpt-4o',
messages: [
{
role: 'system',
content: `${RECOMMENDATION_PROMPT}
TOP MATCHING PRODUCTS:
${productContext}
USER CONTEXT:
- Occasion: ${userContext.occasion || 'not specified'}
- Budget: ${userContext.budget || 'not specified'}
- Preferences: ${JSON.stringify(userContext.preferences || {})}`
},
...context.conversationHistory,
{ role: 'user', content: userMessage }
],
tools: recommendationTools
});
return processRecommendationResponse(response, userId);
}Example Conversations
Need-Based:
👤: Hai, lagi cari dress buat kondangan
🤖: Hai Kak! Mau cari dress kondangan ya 😊
Biar aku bisa rekomendasikan yang pas,
boleh tau:
1️⃣ Budget range-nya berapa kak?
2️⃣ Prefer warna apa?
3️⃣ Kondangannya outdoor atau indoor?
---
👤: Budget 500k, warna soft gitu, indoor
🤖: Oke budget 500k, warna soft, indoor! ✨
Aku rekomendasikan:
1️⃣ *Dress Brukat Elegan* - Navy Soft
💰 Rp 350.000
✨ Best seller! Bahan brukat premium,
cocok banget untuk kondangan indoor.
⭐ 4.8/5 (156 reviews)
2️⃣ *Midi Dress Satin* - Dusty Pink
💰 Rp 425.000
✨ Tampilan mewah dengan bahan satin
yang jatuh cantik. Elegant!
⭐ 4.7/5 (89 reviews)
3️⃣ *A-Line Dress Floral* - Sage
💰 Rp 299.000
✨ Motif bunga subtle, feminine banget!
Budget friendly tapi tetap stylish.
⭐ 4.6/5 (203 reviews)
Mau lihat detail yang mana kak?
Atau ada preference lain?Upsell:
👤: Yang nomor 1 deh, dress brukat
🤖: Great choice kak! Dress Brukat Elegan
memang best seller kami! 💕
Btw, ada juga versi *Premium* dengan:
✨ Payet handmade
✨ Inner dress silk
✨ Free alterasi
Cuma selisih Rp 100k jadi Rp 450.000.
Worth it untuk acara spesial!
Mau yang regular atau premium kak?Cross-Sell:
👤: Yang regular aja
🤖: Siap kak! Dress Brukat Elegan - Navy ✅
Biar makin sempurna, dress ini cocok
dipadukan dengan:
👜 *Clutch Bag Pesta* - Gold
💰 Rp 150.000 (hemat 20% bundle!)
👠 *Heels Block 5cm* - Nude
💰 Rp 275.000
Mau sekalian kak?
Atau langsung checkout dress-nya aja?Analytics
javascript
// Track recommendation performance
async function trackRecommendation(userId, recommendedProducts, selectedProduct) {
await db.recommendationLogs.insertOne({
userId,
recommendedProducts: recommendedProducts.map(p => p.id),
selectedProduct: selectedProduct?.id,
converted: !!selectedProduct,
timestamp: new Date()
});
}
// Get recommendation analytics
router.get('/analytics/recommendations', async (req, res) => {
const stats = await db.recommendationLogs.aggregate([
{
$group: {
_id: null,
totalRecommendations: { $sum: 1 },
conversions: { $sum: { $cond: ['$converted', 1, 0] } }
}
}
]).toArray();
const conversionRate = (stats[0].conversions / stats[0].totalRecommendations * 100).toFixed(1);
res.json({
...stats[0],
conversionRate: `${conversionRate}%`
});
});Best Practices
DO ✅
- Tanya kebutuhan dulu
- Limit 3-5 recommendations
- Jelaskan kenapa cocok
- Natural upsell/cross-sell
- Track conversion
- Learn from dataDON'T ❌
- Spam banyak produk
- Pushy upsell
- Generic recommendations
- Ignore preferences
- No personalization
- Hard-sell approachFAQ
Berapa produk ideal direkomendasikan?
3 produk optimal. Lebih dari 5 = overwhelming, kurang dari 2 = kurang pilihan.
Kapan timing upsell yang tepat?
Setelah customer pilih produk, bukan di awal. Natural dan tidak pushy.
Kesimpulan
AI Recommendation = Higher conversion!
| No Recommendation | AI Recommendation |
|---|---|
| Self-browse | Guided shopping |
| Low conversion | +30-50% conversion |
| No upsell | Natural upsell |