Auto Reply WA untuk Feedback & Survey

Setup auto reply WhatsApp untuk collect feedback dan survey. NPS, CSAT, rating produk. Response rate lebih tinggi!

Auto Reply WA untuk Feedback & Survey
Auto Reply WA untuk Feedback & Survey

WhatsApp survey = Response rate 3x lebih tinggi dari email!

Collect feedback langsung di platform yang customer sudah gunakan setiap hari.


Jenis Survey via WhatsApp

1. CSAT (Customer Satisfaction)

😊 RATING LAYANAN

Hai Kak [NAMA]!

Gimana pengalaman belanja di [BRAND] hari ini?

⭐⭐⭐⭐⭐ 5 - Sangat Puas
⭐⭐⭐⭐ 4 - Puas
⭐⭐⭐ 3 - Biasa
⭐⭐ 2 - Kurang Puas
⭐ 1 - Tidak Puas

Ketik angka 1-5 ya!

2. NPS (Net Promoter Score)

📊 SEBERAPA MUNGKIN?

Hai Kak [NAMA]!

Seberapa mungkin kakak merekomendasikan 
[BRAND] ke teman/keluarga?

Skala 0-10:
0 = Tidak mungkin
10 = Sangat mungkin

Ketik angka 0-10!

3. Product Review

⭐ REVIEW PRODUK

Hai Kak [NAMA]!

[PRODUK] nya sudah sampai dengan baik?

Boleh kasih rating 1-5?
5⭐ = Sangat Bagus
4⭐ = Bagus
3⭐ = Biasa
2⭐ = Kurang
1⭐ = Buruk

Ketik angka, boleh tambah komentar! 😊

4. Quick Poll

📊 QUICK POLL

Hai [BRAND] Squad! 

Warna baru mana yang kakak mau?

🔵 A - Navy Blue
🟢 B - Forest Green
🟣 C - Royal Purple
🟡 D - Mustard Yellow

Ketik huruf pilihanmu!

Implementation

Survey Flow Handler:

javascript

const surveyState = new Map();

const surveys = {
    csat: {
        type: 'csat',
        questions: [
            {
                id: 'rating',
                text: 'Gimana pengalaman belanja hari ini? (1-5)',
                type: 'rating',
                min: 1,
                max: 5
            },
            {
                id: 'comment',
                text: 'Ada saran untuk kami? (ketik SKIP kalau tidak ada)',
                type: 'text',
                optional: true
            }
        ]
    },
    nps: {
        type: 'nps',
        questions: [
            {
                id: 'score',
                text: 'Seberapa mungkin rekomendasikan kami? (0-10)',
                type: 'rating',
                min: 0,
                max: 10
            },
            {
                id: 'reason',
                text: 'Boleh kasih tau alasannya? (ketik SKIP kalau tidak)',
                type: 'text',
                optional: true
            }
        ]
    },
    product_review: {
        type: 'product_review',
        questions: [
            {
                id: 'rating',
                text: 'Rating produk 1-5?',
                type: 'rating',
                min: 1,
                max: 5
            },
            {
                id: 'quality',
                text: 'Kualitas sesuai harapan? (YA/TIDAK)',
                type: 'boolean'
            },
            {
                id: 'review',
                text: 'Review singkat untuk produk ini?',
                type: 'text'
            }
        ]
    }
};

async function startSurvey(phone, surveyType, context = {}) {
    const survey = surveys[surveyType];
    
    surveyState.set(phone, {
        surveyType,
        currentQuestion: 0,
        answers: {},
        context, // e.g., { orderId, productId }
        startedAt: Date.now()
    });
    
    return survey.questions[0].text;
}

async function processSurveyAnswer(phone, answer) {
    const state = surveyState.get(phone);
    if (!state) return null;
    
    const survey = surveys[state.surveyType];
    const question = survey.questions[state.currentQuestion];
    
    // Validate answer
    const validation = validateAnswer(answer, question);
    if (!validation.valid) {
        return validation.message;
    }
    
    // Save answer
    state.answers[question.id] = validation.value;
    
    // Move to next question
    state.currentQuestion++;
    
    if (state.currentQuestion >= survey.questions.length) {
        // Survey complete
        await saveSurveyResponse(phone, state);
        surveyState.delete(phone);
        return getThankYouMessage(state);
    }
    
    // Return next question
    surveyState.set(phone, state);
    return survey.questions[state.currentQuestion].text;
}

function validateAnswer(answer, question) {
    const text = answer.trim();
    
    // Handle skip
    if (text.toUpperCase() === 'SKIP' && question.optional) {
        return { valid: true, value: null };
    }
    
    switch (question.type) {
        case 'rating':
            const num = parseInt(text);
            if (isNaN(num) || num < question.min || num > question.max) {
                return { 
                    valid: false, 
                    message: `Masukkan angka ${question.min}-${question.max} ya!` 
                };
            }
            return { valid: true, value: num };
            
        case 'boolean':
            const lower = text.toLowerCase();
            if (!['ya', 'tidak', 'yes', 'no', 'y', 'n'].includes(lower)) {
                return { valid: false, message: 'Jawab YA atau TIDAK ya!' };
            }
            return { valid: true, value: ['ya', 'yes', 'y'].includes(lower) };
            
        case 'text':
            return { valid: true, value: text };
            
        default:
            return { valid: true, value: text };
    }
}

Save & Analyze:

javascript

async function saveSurveyResponse(phone, state) {
    const response = {
        phone,
        surveyType: state.surveyType,
        answers: state.answers,
        context: state.context,
        completedAt: new Date(),
        duration: Date.now() - state.startedAt
    };
    
    await db.surveyResponses.insert(response);
    
    // Calculate metrics
    if (state.surveyType === 'nps') {
        await updateNPSMetrics(response.answers.score);
    }
    
    if (state.surveyType === 'csat') {
        await updateCSATMetrics(response.answers.rating);
    }
    
    // Trigger actions based on response
    if (state.answers.rating <= 2 || state.answers.score <= 6) {
        // Low score - alert team
        await alertTeam({
            type: 'low_survey_score',
            phone,
            score: state.answers.rating || state.answers.score,
            context: state.context
        });
    }
}

function calculateNPS(responses) {
    const scores = responses.map(r => r.answers.score);
    
    const promoters = scores.filter(s => s >= 9).length;
    const detractors = scores.filter(s => s <= 6).length;
    const total = scores.length;
    
    const nps = ((promoters - detractors) / total) * 100;
    
    return {
        nps: Math.round(nps),
        promoters: Math.round((promoters / total) * 100),
        passives: Math.round(((total - promoters - detractors) / total) * 100),
        detractors: Math.round((detractors / total) * 100),
        totalResponses: total
    };
}

Trigger Survey Automatically

javascript

// After order delivered
async function onOrderDelivered(order) {
    // Wait 2 days, then send survey
    await scheduleMessage({
        phone: order.customerPhone,
        template: 'survey_csat',
        sendAt: Date.now() + 2 * 24 * 60 * 60 * 1000,
        context: { orderId: order.id }
    });
}

// After customer service interaction
async function onTicketResolved(ticket) {
    // Wait 1 hour, then send survey
    await scheduleMessage({
        phone: ticket.customerPhone,
        template: 'survey_support',
        sendAt: Date.now() + 60 * 60 * 1000,
        context: { ticketId: ticket.id }
    });
}

// Monthly NPS
cron.schedule('0 10 1 * *', async () => {
    // First of every month
    const activeCustomers = await getActiveCustomers(30); // Active in last 30 days
    
    for (const customer of activeCustomers) {
        await sendNPSSurvey(customer.phone);
    }
});

Response Templates

Thank You (Good Rating):

🎉 TERIMA KASIH!

Rating: [RATING]⭐

Wah, senang sekali kakak puas! 😊

Kalau berkenan, boleh review di Google/Tokopedia?
[LINK]

Sebagai terima kasih, ini voucher Rp 10.000:
🏷️ THANKS[KODE]

Terima kasih banyak ya kak! 💕

Thank You (Low Rating):

🙏 TERIMA KASIH FEEDBACKNYA

Rating: [RATING]⭐

Mohon maaf belum bisa memuaskan kakak 😔

Feedback kakak sangat berharga untuk kami improve.

Tim kami akan segera follow up untuk 
membantu menyelesaikan masalah ini.

Mohon tunggu ya kak 🙏

Follow Up Low Score:

Hai Kak [NAMA],

Saya [NAMA CS], follow up dari rating kemarin.

Mohon maaf atas pengalaman yang kurang menyenangkan.

Boleh cerita lebih detail apa yang terjadi?
Kami ingin memperbaiki dan pastikan 
tidak terulang lagi.

Terima kasih 🙏

Survey Analytics Dashboard

📊 SURVEY DASHBOARD

Period: Last 30 Days

NPS SCORE: +45
├── Promoters (9-10): 55%
├── Passives (7-8): 35%
└── Detractors (0-6): 10%

CSAT SCORE: 4.2/5
├── 5⭐: 45%
├── 4⭐: 35%
├── 3⭐: 12%
├── 2⭐: 5%
└── 1⭐: 3%

RESPONSE RATE: 42%
(126 responses / 300 sent)

TOP FEEDBACK THEMES:
1. Fast delivery (32 mentions) ✅
2. Product quality (28 mentions) ✅
3. Packaging (15 mentions) ⚠️
4. Customer service (12 mentions) ✅

Best Practices

DO ✅

- Keep surveys SHORT (2-3 questions max)
- Send at right timing
- Personalize with name/order
- Follow up on low scores
- Act on feedback
- Close the loop (tell what you improved)

DON'T ❌

- Long surveys (>5 questions)
- Send too frequently
- Ignore negative feedback
- No follow up action
- Generic thank you only

FAQ

Berapa response rate yang bagus?

30-40% via WhatsApp sudah bagus (vs 5-10% email). Bisa lebih tinggi dengan incentive.

Kapan waktu terbaik kirim survey?

2-3 hari setelah experience (order delivered, ticket resolved). Masih fresh tapi sudah ada waktu evaluate.

Perlu kasih incentive?

Optional, tapi bisa boost response 20-30%. Small voucher (Rp 10-25k) sudah cukup.


Kesimpulan

WhatsApp survey = High engagement feedback!

Email SurveyWhatsApp Survey
5-10% response30-40% response
Formal feelCasual & easy
Days to respondMinutes to respond
Easy to ignoreHard to miss

Start collecting actionable feedback!

Setup Survey Bot →


Artikel Terkait