Cara Balas WA Otomatis Berurutan (Sequence)
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: Offer3. 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 Blast | Sequence |
|---|---|
| All at once | Gradual |
| No follow-up | Systematic |
| Low conversion | Higher conversion |
Nurture leads automatically!