Bot Jualan Multi Produk: Kelola 100+ Item

Cara kelola bot jualan WhatsApp dengan ratusan produk. Kategori, search, filter. Efisien untuk katalog besar!

Bot Jualan Multi Produk
Bot Jualan Multi Produk

Punya 100+ produk? Tidak mungkin tampilkan semua di satu pesan!

Butuh sistem katalog yang terorganisir supaya customer mudah cari dan bot tetap responsif.


Tantangan Multi Produk

❌ 1 pesan dengan 100 produk = Spam
❌ Customer scroll panjang = Malas
❌ Search manual = Tidak efisien
❌ Update 1-1 = Capek

Solusi: Katalog Terstruktur

✅ Kategori & sub-kategori
✅ Search by keyword
✅ Filter (harga, ukuran, warna)
✅ Pagination
✅ Quick code untuk repeat order

Struktur Katalog

📦 KATALOG [TOKO]

Pilih kategori:

1️⃣ 👕 Fashion Pria (45 item)
2️⃣ 👗 Fashion Wanita (62 item)
3️⃣ 👟 Sepatu (38 item)
4️⃣ 👜 Tas & Aksesoris (25 item)
5️⃣ 🆕 New Arrival (12 item)
6️⃣ 🔥 Best Seller (10 item)

Ketik angka untuk pilih kategori.
Atau ketik: CARI [nama produk]

Sub-kategori:

👕 FASHION PRIA

Sub-kategori:
1️⃣ Kaos (18 item)
2️⃣ Kemeja (12 item)
3️⃣ Jaket (8 item)
4️⃣ Celana (7 item)

Ketik angka untuk lihat produk.
Atau BACK untuk kembali.

List Produk (Paginated):

👕 KAOS PRIA (Hal 1/3)

1. KP001 - Kaos Polos Basic
   💰 Rp 75.000 | Size: S-XL
   
2. KP002 - Kaos Oversize Premium
   💰 Rp 120.000 | Size: M-XXL

3. KP003 - Kaos Graphic Vintage
   💰 Rp 95.000 | Size: S-XL

4. KP004 - Kaos Polo Classic
   💰 Rp 150.000 | Size: S-XL

5. KP005 - Kaos Henley
   💰 Rp 110.000 | Size: M-XL

━━━━━━━━━━━━━━━━━━━━━
Ketik kode (KP001) untuk detail.
NEXT untuk halaman berikutnya.
BACK untuk kembali.

Detail Produk:

📦 KP001 - Kaos Polos Basic

[Gambar Produk]

💰 Harga: Rp 75.000
📏 Size: S, M, L, XL
🎨 Warna: Hitam, Putih, Navy, Abu
📦 Bahan: Cotton Combed 30s

Stok:
- Hitam: S(5) M(8) L(10) XL(3)
- Putih: S(3) M(6) L(8) XL(2)
- Navy: S(0) M(4) L(5) XL(1)
- Abu: S(4) M(7) L(6) XL(4)

Order? Ketik:
ORDER KP001 [WARNA] [SIZE] [QTY]
Contoh: ORDER KP001 Hitam L 2

Customer: "CARI kaos hitam"

Bot: 🔍 HASIL PENCARIAN: "kaos hitam"

Ditemukan 5 produk:

1. KP001 - Kaos Polos Basic (Hitam)
   💰 Rp 75.000

2. KP002 - Kaos Oversize (Hitam)
   💰 Rp 120.000

3. KP003 - Kaos Graphic (Hitam)
   💰 Rp 95.000

[2 produk lainnya...]

Ketik kode untuk detail.

Advanced Filter:

Customer: "FILTER harga <100000"

Bot: 🔍 FILTER: Harga di bawah Rp 100.000

Ditemukan 28 produk:

[List produk dengan harga < 100k]

Filter lain:
- FILTER size XL
- FILTER warna hitam
- FILTER kategori kaos

Implementasi

Database Schema:

javascript

// Products collection
{
    code: 'KP001',
    name: 'Kaos Polos Basic',
    description: 'Kaos polos bahan cotton combed 30s',
    price: 75000,
    category: 'fashion-pria',
    subcategory: 'kaos',
    tags: ['kaos', 'polos', 'basic', 'cotton'],
    variants: [
        { color: 'Hitam', sizes: { S: 5, M: 8, L: 10, XL: 3 } },
        { color: 'Putih', sizes: { S: 3, M: 6, L: 8, XL: 2 } },
        // ...
    ],
    images: ['url1', 'url2'],
    active: true,
    createdAt: Date,
    updatedAt: Date
}

// Categories collection
{
    id: 'fashion-pria',
    name: 'Fashion Pria',
    icon: '👕',
    parent: null, // atau parent category ID
    order: 1
}

Category Navigation:

javascript

const userState = new Map(); // Track user navigation state

client.on('message', async msg => {
    const text = msg.body.trim();
    const state = userState.get(msg.from) || { level: 'main' };
    
    // Main menu
    if (text.toUpperCase() === 'KATALOG') {
        const categories = await db.categories.find({ parent: null });
        await msg.reply(formatMainCatalog(categories));
        userState.set(msg.from, { level: 'categories' });
        return;
    }
    
    // Category selection
    if (state.level === 'categories' && /^\d+$/.test(text)) {
        const categories = await db.categories.find({ parent: null });
        const selected = categories[parseInt(text) - 1];
        
        const subcats = await db.categories.find({ parent: selected.id });
        
        if (subcats.length > 0) {
            await msg.reply(formatSubcategories(selected, subcats));
            userState.set(msg.from, { level: 'subcategories', category: selected.id });
        } else {
            const products = await db.products.find({ category: selected.id });
            await msg.reply(formatProductList(products, 1));
            userState.set(msg.from, { level: 'products', category: selected.id, page: 1 });
        }
        return;
    }
    
    // Pagination
    if (text.toUpperCase() === 'NEXT' && state.level === 'products') {
        const products = await db.products.find({ category: state.category });
        const nextPage = state.page + 1;
        await msg.reply(formatProductList(products, nextPage));
        userState.set(msg.from, { ...state, page: nextPage });
        return;
    }
    
    // Back navigation
    if (text.toUpperCase() === 'BACK') {
        // Go back one level
        // ...
    }
});

Search Function:

javascript

async function searchProducts(query) {
    // Full-text search atau simple contains
    const results = await db.products.find({
        $or: [
            { name: { $regex: query, $options: 'i' } },
            { tags: { $in: [query.toLowerCase()] } },
            { code: { $regex: query, $options: 'i' } }
        ],
        active: true
    }).limit(10);
    
    return results;
}

// Bot handler
if (text.toUpperCase().startsWith('CARI ')) {
    const query = text.substring(5);
    const results = await searchProducts(query);
    
    if (results.length > 0) {
        await msg.reply(formatSearchResults(query, results));
    } else {
        await msg.reply(`Tidak ditemukan produk untuk "${query}". Coba keyword lain!`);
    }
}

Quick Order by Code:

javascript

// ORDER KP001 Hitam L 2
if (text.toUpperCase().startsWith('ORDER ')) {
    const parts = text.substring(6).split(' ');
    const [code, color, size, qty] = parts;
    
    const product = await db.products.findOne({ code: code.toUpperCase() });
    
    if (!product) {
        await msg.reply('Kode produk tidak ditemukan.');
        return;
    }
    
    // Validate variant & stock
    const variant = product.variants.find(v => 
        v.color.toLowerCase() === color.toLowerCase()
    );
    
    if (!variant || !variant.sizes[size] || variant.sizes[size] < parseInt(qty)) {
        await msg.reply('Varian/stok tidak tersedia.');
        return;
    }
    
    // Add to cart or process order
    await addToCart(msg.from, {
        productCode: code,
        productName: product.name,
        color,
        size,
        quantity: parseInt(qty),
        price: product.price
    });
    
    await msg.reply(`✅ Ditambahkan ke keranjang!\n${product.name} (${color}, ${size}) x ${qty}`);
}

Tips Multi Produk

1. Use Product Codes

Setiap produk punya kode unik:
KP001, KP002, SP001, TS001...

Lebih mudah untuk order & reference.

2. Smart Categorization

Jangan terlalu dalam (max 3 level):
Kategori → Sub-kategori → Produk

Terlalu dalam = customer bingung.

3. Popular/Featured Section

Shortcut untuk produk populer:
- Best Seller
- New Arrival
- Promo

Customer tidak perlu browse semua.

4. Bulk Update

javascript

// Update harga semua produk di kategori
await db.products.updateMany(
    { category: 'fashion-pria' },
    { $mul: { price: 1.1 } } // Naik 10%
);

FAQ

Berapa produk max yang bisa di-handle?

Tidak ada limit teknis. Dengan pagination dan search, 1000+ produk bisa di-handle dengan baik.

Bagaimana update produk banyak sekaligus?

Import dari Excel/CSV untuk bulk update. Atau admin panel untuk edit.

Perlu gambar untuk setiap produk?

Recommended untuk fashion/visual products. Untuk B2B/technical, text cukup.


Kesimpulan

Multi produk = Butuh struktur!

Tanpa StrukturDengan Struktur
Spam 1 pesanKategori rapi
Susah cariSearch & filter
Customer bingungEasy navigation

Organize catalog, help customers find!

Setup Multi-Product Bot →


Artikel Terkait