Auto Reply WA untuk Feedback & Survey
Setup auto reply WhatsApp untuk collect feedback dan survey. NPS, CSAT, rating produk. Response rate lebih tinggi!
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 onlyFAQ
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 Survey | WhatsApp Survey |
|---|---|
| 5-10% response | 30-40% response |
| Formal feel | Casual & easy |
| Days to respond | Minutes to respond |
| Easy to ignore | Hard to miss |
Start collecting actionable feedback!