הטמעת סקר NPS באתר
משתמשים עוזבים ואתם לא יודעים למה? סקר NPS (Net Promoter Score) הוא תקן למדידת נאמנות, אך הטמעתו נעשית לעיתים קרובות בצורה שגויה: הצגה לכולם ללא פילוח, אי קישור לאירועים ספציפיים. התוצאה היא אחוזי תגובה נמוכים ונתונים זבל שלא עוזרים לעסק.
במשך 5 שנים, הטמענו NPS ביותר מ-50 פרויקטים—מ-SaaS ועד חנויות מקוונות. בפרויקט אחד, הגדרת טריגרים נכונה הגדילה את אחוזי התגובה ב-30%, וטיפול בזמן אמת במבקרים שליליים הפחית את הנטישה ב-15%. בפרויקט אחר, התראות מיידיות על מבקרים שליליים הפחיתו את נטישת הלקוחות ב-25%. הניסיון שלנו מבטיח נתונים נקיים ותובנות מעשיות.
פילוח נכון ותדירות הצגה הם המפתח ל-NPS גבוה ולנתונים רלוונטיים. לדוגמה, עבור חנות מקוונת, אנו מגדירים הצגה לאחר כל רכישה עבור לקוחות חדשים, ועבור B2B SaaS, לאחר סיום תקופת ניסיון או פנייה ראשונה לתמיכה.
צרו קשר כדי לקבל ייעוץ על הטמעת NPS ולהעריך חיסכון פוטנציאלי בנטישה.
כיצד טעויות נפוצות הורסות את ערך ה-NPS
טעות ראשונה: הצגת הסקר לכל המשתמשים ללא הבחנה. משתמשים חדשים (פחות מ-7 ימים) עדיין לא גיבשו רושם, ומשתמשים עם כרטיסי תמיכה פתוחים צפויים להיות לא מרוצים. התוצאה היא נתונים מוטים.
שנייה: הצגה נדירה מדי או תכופה מדי. אם תציגו את הסקר פעם בחצי שנה, תפספסו שינויים ברגשות. אם כל יום, משתמשים יחסמו את הווידג'ט עם חוסם פרסומות. אופטימלי: פעם ב-90 יום, מקושר לפעולה מרכזית.
שלישית: התעלמות מפילוח. מבקרים שליליים (0-6) וממליצים (9-10) דורשים גישות שונות. מבקר שלילי זקוק לתגובה מיידית ולפתרון בעיה; ממליץ—לתודה ולהצעה להצטרף לתוכנית נאמנות.
אילו נתונים לאסוף יחד עם הציון?
בנוסף לציון (0-10) ולתגובה, אנו שומרים: מזהה משתמש או session_id, אירוע טריגר (order_completed, trial_ended), כתובת URL של הדף, כתובת IP וחותמת זמן. זה מאפשר לפלח תוצאות ולזהות נקודות בעייתיות בממשק. בקצה האחורי, זה נראה כך:
// database/migrations/create_nps_responses_table.php
Schema::create('nps_responses', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->nullable()->constrained()->nullOnDelete();
$table->string('session_id')->nullable();
$table->tinyInteger('score')->unsigned(); // 0-10
$table->text('comment')->nullable();
$table->string('trigger_event')->nullable(); // 'order_completed', 'trial_ended'
$table->string('page_url')->nullable();
$table->ipAddress('ip')->nullable();
$table->timestamps();
});
// NpsController
public function store(Request $request): JsonResponse
{
$validated = $request->validate([
'score' => 'required|integer|min:0|max:10',
'comment' => 'nullable|string|max:1000',
'trigger_event' => 'nullable|string|max:100',
]);
$response = NpsResponse::create([
...$validated,
'user_id' => auth()->id(),
'session_id' => $request->session()->getId(),
'page_url' => $request->input('page_url'),
'ip' => $request->ip(),
]);
// Сохраняем в сессии чтобы не показывать снова
$request->session()->put('nps_submitted_at', now()->timestamp);
// Алерт в Slack если критик оставил комментарий
if ($validated['score'] <= 6 && !empty($validated['comment'])) {
SlackNotification::send('#feedback', "NPS {$validated['score']}: {$validated['comment']}");
}
return response()->json(['success' => true]);
} מתי ולמי להציג: תנאי טריגר
תזמון ההצגה הוא 60% מההצלחה. אנו משתמשים בשלוש קטגוריות טריגר:
| סוג טריגר | דוגמאות | עיכוב בהצגה |
|---|---|---|
| מבוסס אירוע | הזמנה הושלמה, תקופת ניסיון הסתיימה, שימוש ראשון בתכונה | מיד לאחר 2-3 שניות |
| מבוסס זמן | 14-30 יום לאחר הרשמה, רבעוני | תלוי במחזור |
| מבוסס פלח | החרגת משתמשים חדשים (<7 ימים), משתמשים עם כרטיסים פתוחים | — |
קצה אחורי: מודל ו-API
// database/migrations/create_nps_responses_table.php
Schema::create('nps_responses', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->nullable()->constrained()->nullOnDelete();
$table->string('session_id')->nullable();
$table->tinyInteger('score')->unsigned(); // 0-10
$table->text('comment')->nullable();
$table->string('trigger_event')->nullable(); // 'order_completed', 'trial_ended'
$table->string('page_url')->nullable();
$table->ipAddress('ip')->nullable();
$table->timestamps();
});
// NpsController
public function store(Request $request): JsonResponse
{
$validated = $request->validate([
'score' => 'required|integer|min:0|max:10',
'comment' => 'nullable|string|max:1000',
'trigger_event' => 'nullable|string|max:100',
]);
$response = NpsResponse::create([
...$validated,
'user_id' => auth()->id(),
'session_id' => $request->session()->getId(),
'page_url' => $request->input('page_url'),
'ip' => $request->ip(),
]);
// Сохраняем в сессии чтобы не показывать снова
$request->session()->put('nps_submitted_at', now()->timestamp);
// Алерт в Slack если критик оставил комментарий
if ($validated['score'] <= 6 && !empty($validated['comment'])) {
SlackNotification::send('#feedback', "NPS {$validated['score']}: {$validated['comment']}");
}
return response()->json(['success' => true]);
} איך לבדוק האם להציג את הווידג'ט?
// Middleware или хелпер для проверки
public function shouldShowNps(Request $request): bool
{
$user = auth()->user();
if (!$user) return false;
// Не показывать чаще раза в 90 дней
$lastShown = $request->session()->get('nps_shown_at');
if ($lastShown && now()->timestamp - $lastShown < 90 * 86400) {
return false;
}
// Уже ответил
if ($request->session()->has('nps_submitted_at')) return false;
// Пользователь зарегистрирован > 14 дней
return $user->created_at->diffInDays(now()) >= 14;
} קצה קדמי: ווידג'ט React
// NpsWidget.tsx
export function NpsWidget({ triggerEvent }: { triggerEvent: string }) {
const [score, setScore] = useState<number | null>(null);
const [comment, setComment] = useState('');
const [step, setStep] = useState<'score' | 'comment' | 'done'>('score');
const submit = async () => {
await fetch('/api/nps', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ score, comment, trigger_event: triggerEvent }),
});
setStep('done');
};
const label = score === null ? '' : score <= 6 ? 'Критик' : score <= 8 ? 'Нейтральный' : 'Промоутер';
return (
<div className="fixed bottom-6 right-6 w-80 rounded-xl bg-white shadow-xl p-5">
{step === 'score' && (
<>
<p className="font-semibold mb-3">Насколько вероятно, что вы порекомендуете нас?</p>
<div className="flex gap-1 justify-between mb-2">
{Array.from({ length: 11 }, (_, i) => (
<button
key={i}
onClick={() => {
setScore(i);
setStep('comment');
}}
className={`w-7 h-7 rounded text-sm ${i <= 6 ? 'bg-red-100' : i <= 8 ? 'bg-yellow-100' : 'bg-green-100'}`}
>
{i}
</button>
))}
</div>
<div className="flex justify-between text-xs text-gray-400">
<span>Маловероятно</span><span>Очень вероятно</span>
</div>
</>
)}
{step === 'comment' && (
<>
<p className="font-semibold mb-2">Оценка: {score} ({label}). Что повлияло на вашу оценку?</p>
<textarea
value={comment}
onChange={e => setComment(e.target.value)}
className="w-full border rounded p-2 text-sm h-20 resize-none"
placeholder="Необязательно..."
/>
<button
onClick={submit}
className="mt-2 w-full bg-blue-600 text-white rounded py-1.5 text-sm"
>
Отправить
</button>
</>
)}
{step === 'done' && <p className="text-center text-green-600 font-medium">Спасибо за обратную связь!</p>}
</div>
);
}
ניתוח NPS: שאילתת SQL לחישוב
-- Расчёт NPS за период
SELECT
COUNT(*) FILTER (WHERE score >= 9)::float / COUNT(*) * 100 AS promoters_pct,
COUNT(*) FILTER (WHERE score <= 6)::float / COUNT(*) * 100 AS detractors_pct,
(COUNT(*) FILTER (WHERE score >= 9) - COUNT(*) FILTER (WHERE score <= 6))::float / COUNT(*) * 100 AS nps_score
FROM nps_responses
WHERE created_at >= now() - interval '90 days'; מה נחשב NPS טוב? השוואה עם חלופות
סקר NPS עדיף על CSAT (שביעות רצון מעסקה ספציפית) כי הוא מודד נאמנות כוללת, לא רושם חד-פעמי. ועדיף על CES (קלות אינטראקציה) להחלטות אסטרטגיות. NPS הוא המדד הטוב ביותר לצמיחה עתידית: חברות עם NPS >50 גדלות פי שניים מהר יותר ממתחרות.
| מדד | מיקוד | שאלה | סולם |
|---|---|---|---|
| NPS | נאמנות | "האם תמליץ?" | 0-10 |
| CSAT | שביעות רצון | "האם אתה מרוצה מהשירות?" | 1-5 |
| CES | קלות | "האם היה קל?" | 1-7 |
דוגמה לחישוב NPS
אם 50% ממליצים (9-10) ו-20% מבקרים שליליים (0-6), אז NPS = 50 - 20 = 30. נייטרליים (7-8) לא נספרים.תהליך ההטמעה
- אנליטיקה: קביעת אירועים מרכזיים ופלחי משתמשים.
- עיצוב: פיתוח טריגרים ועיצוב ווידג'ט.
- הטמעה: כתיבת API, מיגרציות, רכיבים.
- בדיקות: בדיקת תנאי הצגה, תקינות איסוף נתונים.
- פריסה: העלאה לסביבת ייצור והגדרת ניטור.
מה כלול
- מודל נתונים ו-API (Laravel 11, PHP 8.3+)
- רכיב ווידג'ט (React 18, Next.js או Vue 3)
- תנאי הצגה עם פילוח
- אינטגרציה עם Slack / Telegram להתראות על מבקרים שליליים
- סקריפט SQL לאנליטיקה ודשבורד (אופציונלי)
- תיעוד על טריגרים ותמיכה
לוח זמנים וחיסכון
ווידג'ט עם אנליטיקה בסיסית—מ-3 עד 4 ימי עסקים. זיהוי בזמן של מבקרים שליליים מפחית נטישה ב-20-40%. להערכת הפרויקט שלכם, צרו קשר—נכין הצעה מותאמת אישית. הזמינו הטמעת NPS והתחילו לאסוף נתוני נאמנות נקיים תוך שבוע.
מקור: ויקיפדיה: Net Promoter







