Cara Balas WA Otomatis Berurutan (Sequence)

Cara Balas WA Otomatis
Cara Balas WA Otomatis

Sequence = Pesan otomatis yang dikirim bertahap!

Tidak langsung semua sekaligus, tapi sesuai timing dan kondisi. Perfect untuk nurturing leads!


Apa Itu Sequence/Drip?

BUKAN sequence:
Customer chat → Langsung dapat 5 pesan sekaligus ❌

SEQUENCE:
Customer chat → Dapat pesan 1
H+1 → Dapat pesan 2
H+3 → Dapat pesan 3
H+7 → Dapat pesan 4

Bertahap sesuai timeline!

Use Cases Sequence

1️⃣ WELCOME SEQUENCE
   New customer → Onboarding series

2️⃣ ABANDONED CART
   Add cart → 1h → 24h → 48h reminders

3️⃣ POST-PURCHASE
   Order → Shipped → Delivered → Review request

4️⃣ RE-ENGAGEMENT
   Inactive → "Miss you" → Offer → Last chance

5️⃣ EDUCATION
   Sign up → Tips day 1 → Tips day 3 → ...

Welcome Sequence Example

Day 0 (Immediate):

🎉 SELAMAT DATANG!

Hai Kak [NAMA]!

Terima kasih sudah follow [TOKO]!

Kami jualan [PRODUK] berkualitas dengan harga terjangkau.

💡 Besok kami kirim tips memilih [PRODUK] yang tepat ya!

Stay tuned! 😊

Day 1:

💡 TIPS HARI INI

Hai Kak [NAMA]!

Tips memilih [PRODUK]:

1. [TIP 1]
2. [TIP 2]
3. [TIP 3]

Mau lihat koleksi kami?
Ketik KATALOG untuk browse! 📦

Day 3:

⭐ BEST SELLER KAMI

Hai Kak [NAMA]!

Ini 3 produk paling laris minggu ini:

1. [PRODUK 1] - Rp [HARGA]
   ⭐ 4.9/5 dari 200 review

2. [PRODUK 2] - Rp [HARGA]
   ⭐ 4.8/5 dari 150 review

3. [PRODUK 3] - Rp [HARGA]
   ⭐ 4.9/5 dari 180 review

Tertarik? Reply dengan angka! 😊

Day 7:

🎁 SPECIAL UNTUK KAKAK!

Hai Kak [NAMA]!

Sudah seminggu kenal kami!
Sebagai apresiasi:

🏷️ DISKON 15% untuk order pertama!
Kode: WELCOME15
Berlaku 3 hari.

Yuk checkout sekarang!
Ketik ORDER untuk mulai 🛒

Implementasi Sequence

Database Schema:

javascript

// Sequences collection
{
    id: 'welcome_sequence',
    name: 'Welcome Series',
    steps: [
        {
            step: 1,
            delay: 0, // immediate
            template: 'welcome_day0',
            condition: null
        },
        {
            step: 2,
            delay: 86400000, // 24 hours in ms
            template: 'welcome_day1',
            condition: null
        },
        {
            step: 3,
            delay: 259200000, // 72 hours
            template: 'welcome_day3',
            condition: 'not_purchased' // only if not purchased yet
        },
        {
            step: 4,
            delay: 604800000, // 7 days
            template: 'welcome_day7',
            condition: 'not_purchased'
        }
    ]
}

// User sequence tracking
{
    oderId: 'user_123',
    sequenceId: 'welcome_sequence',
    currentStep: 2,
    startedAt: Date,
    lastSentAt: Date,
    status: 'active', // active, completed, stopped
    data: {} // dynamic data for templates
}

Sequence Engine:

javascript

async function processSequences() {
    const now = Date.now();
    
    // Get all active user sequences
    const activeSequences = await db.userSequences.find({
        status: 'active'
    });
    
    for (const userSeq of activeSequences) {
        const sequence = await db.sequences.findById(userSeq.sequenceId);
        const currentStep = sequence.steps[userSeq.currentStep - 1];
        const nextStep = sequence.steps[userSeq.currentStep];
        
        if (!nextStep) {
            // Sequence complete
            await db.userSequences.update(userSeq.id, { status: 'completed' });
            continue;
        }
        
        // Check if it's time for next step
        const timeSinceLastSent = now - userSeq.lastSentAt;
        
        if (timeSinceLastSent >= nextStep.delay) {
            // Check condition
            if (nextStep.condition) {
                const conditionMet = await checkCondition(userSeq.userId, nextStep.condition);
                if (!conditionMet) {
                    // Skip this step or stop sequence
                    await db.userSequences.update(userSeq.id, { 
                        currentStep: userSeq.currentStep + 1 
                    });
                    continue;
                }
            }
            
            // Send message
            const template = await getTemplate(nextStep.template);
            const message = personalizeTemplate(template, userSeq.data);
            await sendWhatsApp(userSeq.userId, message);
            
            // Update tracking
            await db.userSequences.update(userSeq.id, {
                currentStep: userSeq.currentStep + 1,
                lastSentAt: now
            });
        }
    }
}

// Run setiap 5 menit
cron.schedule('*/5 * * * *', processSequences);

Start Sequence for User:

javascript

async function startSequence(userId, sequenceId, data = {}) {
    // Check if already in this sequence
    const existing = await db.userSequences.findOne({
        oderId: oderId,
        sequenceId,
        status: 'active'
    });
    
    if (existing) {
        return; // Already in sequence
    }
    
    // Create new sequence tracking
    await db.userSequences.insert({
        oderId: oderId,
        sequenceId,
        currentStep: 1,
        startedAt: Date.now(),
        lastSentAt: Date.now(),
        status: 'active',
        data
    });
    
    // Send first message immediately
    const sequence = await db.sequences.findById(sequenceId);
    const firstStep = sequence.steps[0];
    
    if (firstStep.delay === 0) {
        const template = await getTemplate(firstStep.template);
        const message = personalizeTemplate(template, data);
        await sendWhatsApp(userId, message);
    }
}

Conditional Logic

Stop on Action:

javascript

// Stop sequence if user purchases
async function onPurchase(userId) {
    // Process purchase...
    
    // Stop welcome sequence
    await db.userSequences.updateMany(
        { oderId: oderId, sequenceId: 'welcome_sequence', status: 'active' },
        { status: 'stopped', stoppedReason: 'purchased' }
    );
    
    // Start post-purchase sequence
    await startSequence(userId, 'post_purchase_sequence');
}

Branch Based on Response:

javascript

async function handleSequenceResponse(userId, response) {
    const userSeq = await db.userSequences.findOne({
        oderId: oderId,
        status: 'active'
    });
    
    if (!userSeq) return;
    
    // Check for trigger words
    if (response.toLowerCase().includes('tidak tertarik')) {
        await db.userSequences.update(userSeq.id, { 
            status: 'stopped',
            stoppedReason: 'user_optout'
        });
        await sendWhatsApp(userId, 'Baik, kami tidak akan mengganggu lagi. Terima kasih!');
    }
    
    if (response.toLowerCase().includes('order')) {
        // Move to sales flow
        await db.userSequences.update(userSeq.id, { status: 'paused' });
        await startOrderFlow(userId);
    }
}

Best Practices Sequence

1. Timing yang Tepat

GUIDELINES:

- Welcome: Day 0, 1, 3, 7
- Abandoned cart: 1h, 24h, 48h
- Re-engagement: Day 7, 14, 30
- Education: Day 1, 3, 5, 7, ...

Jangan terlalu sering!

2. Value di Setiap Step

❌ JANGAN:
Step 1: "Beli dong"
Step 2: "Kok belum beli?"
Step 3: "Beli sekarang!"

✅ LAKUKAN:
Step 1: Welcome + value
Step 2: Tips/education
Step 3: Social proof
Step 4: Offer

3. Easy Opt-out

Setiap pesan harus ada cara stop:

"Reply STOP untuk berhenti menerima pesan ini."

Honor opt-out immediately!

4. Personalization

javascript

// Dynamic content based on user data
const message = `Hai ${user.name}!

Kami lihat kamu tertarik dengan ${user.lastViewedCategory}.

Ini rekomendasi untuk kamu:
${getRecommendations(user.preferences)}`;

Monitoring Sequence

javascript

// Track sequence performance
async function getSequenceMetrics(sequenceId) {
    const total = await db.userSequences.count({ sequenceId });
    const completed = await db.userSequences.count({ sequenceId, status: 'completed' });
    const stopped = await db.userSequences.count({ sequenceId, status: 'stopped' });
    const converted = await db.userSequences.count({ sequenceId, converted: true });
    
    return {
        total,
        completionRate: completed / total,
        dropoffRate: stopped / total,
        conversionRate: converted / total,
        avgStepsBeforeConversion: await calculateAvgSteps(sequenceId)
    };
}

FAQ

Berapa step ideal dalam sequence?

4-7 steps untuk most sequences. Lebih dari itu = fatigue. Kecuali educational course yang memang panjang.

Bagaimana jika user reply di tengah sequence?

Pause sequence, handle conversation, lalu resume atau stop tergantung outcome.

Bisa multiple sequence bersamaan?

Bisa, tapi hati-hati jangan overload. Max 2 sequence aktif per user.


Kesimpulan

Sequence = Automated nurturing!

One-time BlastSequence
All at onceGradual
No follow-upSystematic
Low conversionHigher conversion

Nurture leads automatically!

Setup Sequence Bot →


Artikel Terkait