שלב
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
מתוך 16
ברוכים הבאים
הערכת שווי עסק מקצועית
ברוכים הבאים לשאלון ValueBuilder המוביל בעולם להערכת שווי חברה. למעשה, השאלון מבוסס על מחקר של למעלה מ-40,000 עסקים ומאפשר לבעלי עסקים ומנכ״לים להבין את הערך האמיתי של החברה ואת הפוטנציאל הגלום בה.
מה תקבלו בסיום השאלון
ניתוח מפורט של 8 מחוללי הערך בחברה שלכם
זיהוי נקודות חוזק ונקודות לשיפור
המלצות מותאמות אישית להגדלת שווי העסק
שיחת ייעוץ מקצועית עם ניר מקובסקי ללא עלות
התחל את השאלון ←
42 שאלות ב-5 קטגוריות מקצועיות
10-15 דקות זמן מילוי ממוצע
8 מחוללי ערך המבוססים על מחקר בינלאומי
פרטיות מלאה המידע מאובטח ולא מועבר לצד שלישי
40,000+ עסקים במאגר המחקר הבינלאומי
ללא עלות שאלון וייעוץ ראשוני
הגורמים המרכזיים שקובעים את שווי העסק שלכם בעיני קונים פוטנציאליים
01
ביצועים כספיים
יציבות ורווחיות לאורך זמן
02
פוטנציאל צמיחה
יכולת הרחבה ופיתוח
03
מבנה שווייצרי
פיזור סיכונים ותלות
04
נדנדת השווי
ניהול תזרים מזומנים
05
הכנסה חוזרת
הכנסות קבועות וצפויות
06
שליטת מונופול
ייחודיות ובידול בשוק
07
שביעות רצון
נאמנות והמלצות לקוחות
08
מרכזיות הבעלים
עצמאות תפעולית
שאלון ValueBuilder מספק מדד שיטתי ומעשי לבניית ערך עסקי בר-קיימא. יתרה מכך, הוא מבוסס על מחקר רחב של עשרות אלפי עסקים. לפיכך, השאלון עוזר להבין לא רק מה מצב העסק היום, אלא גם מה ניתן לשפר כדי להגדיל את שוויו בעתיד. כמו כן, לקריאה נוספת על הערכת שווי ומועצת TAB ראו את עמוד מועצת TAB Boardroom .
התחל את השאלון ←
שלב 1 מתוך 16 · פרטים אישיים
פרטי המשיב
כדי שנוכל לשלוח לכם את הדוח המותאם אישית ולייצר קשר מקצועי, אנא מלאו את הפרטים הבאים:
שם מלא *
טלפון *
כתובת מייל *
שם החברה/ארגון *
→ הקודם
הבא ←
שלב 2 מתוך 16 · העסק והלקוחות
תיאור העסק ובלעדיות
ראשית, נבחן את מהות העסק, את מצב התעשייה ואת הבלעדיות של ההצעה שלכם ללקוחות.
שאלה 1
1
במשפט אחד, איך הייתם מתארים את העסק שלכם למכר חדש?
שאלה 2
2
האם הייתם אומרים שהתעשייה שלכם:
בדעיכה
צומחת בקצב הכלכלה
צומחת מעט יותר מהכלכלה
צומחת הרבה יותר מהכלכלה
לא בטוח
שאלה 3
3
איזה מהבאים מתאר הכי טוב את הבלעדיות של העסק שלכם ללקוחות:
אנחנו מוכרים מוצר/שירות שלקוחותינו יכולים לקבל מהרבה ספקים אחרים
אנחנו מוכרים מוצר/שירות שלקוחותינו יכולים לקבל מכמה ספקים אחרים
יש לנו מוצר/שירות נישה שהוא ייחודי בשוק
יש לנו מונופול על השירות/מוצר שאנחנו מוכרים
→ הקודם
הבא ←
שלב 3 מתוך 16 · העסק והלקוחות
נתח שוק והתאמה אישית
בהמשך, נבדוק את נתח השוק, הקשר האישי ורמת ההתאמה שאתם מספקים ללקוחות.
שאלה 4
4
לגבי נתח השוק למוצרים/שירותים שאתם מוכרים, האם אתם מוכרים ל:
רוב האנשים שקונים מה שאתם מספקים (מעל 90% נתח שוק)
יותר ממחצית האנשים (מעל 50% נתח שוק)
פחות ממחצית האנשים (פחות מ-50% נתח שוק)
חלק קטן מאוד (פחות מ-10% נתח שוק)
שאלה 5
5
איזה מהבאים מתאר הכי טוב את הקשר האישי שלכם עם לקוחות החברה:
אני מכיר כל לקוח שלי בשם פרטי והם מצפים שאני אתערב אישית
אני מכיר רוב הלקוחות שלי בשם פרטי
אני מכיר חלק מהלקוחות שלי בשם פרטי
אני לא מכיר את הלקוחות שלי אישית
שאלה 6
6
איזה מהבאים מתאר הכי טוב את רמת ההתאמה האישית שאתם מציעים:
פתרון מותאם אישית לחלוטין לכל לקוח
סט בסיסי שאנחנו מתאימים הרבה ללקוחות
סט סטנדרטי שאנחנו משנים קלות לחלק מהלקוחות
אנחנו לא מתאימים את המוצרים ללקוחות בודדים
→ הקודם
הבא ←
שלב 4 מתוך 16 · שביעות רצון לקוחות
שביעות רצון והמלצות
כמו כן, שביעות רצון והמלצות הן מנועי ערך קריטיים המשפיעים על שווי העסק.
שאלה 7
7
אנא העריכו את אחוז הלקוחות שלכם שהם מאוד מרוצים:
פחות מ-25% מהלקוחות שלנו מאוד מרוצים
25%-50% מהלקוחות שלנו מאוד מרוצים
51%-75% מהלקוחות שלנו מאוד מרוצים
יותר מ-75% מהלקוחות שלנו מאוד מרוצים
שאלה 8
8
כמה פעמים לקוחות קיימים ממליצים על החברה שלכם:
תמיד
לפעמים
לעיתים רחוקות
אף פעם
שאלה 9
9
ב-12 החודשים האחרונים, איזה חלק מהלקוחות שלכם התלונן בכתב:
אף אחד
פחות מ-1%
1-5%
5-10%
יותר מ-10%
→ הקודם
הבא ←
שלב 5 מתוך 16 · מודל עסקי
מודל רווח ותשלומים
לפיכך, המודל העסקי ומבנה התשלומים קובעים את יכולת יצירת המזומנים של העסק.
שאלה 10
10
איזה מהבאים מתאר הכי טוב את המודל העסקי שלכם?
שולי הרווח שלנו יורדים עם כל לקוח חדש
שולי הרווח שלנו נשארים בערך אותו דבר
שולי הרווח שלנו משתפרים קצת עם כל לקוח חדש
שולי הרווח שלנו משתפרים הרבה עם כל לקוח חדש
שאלה 11
11
איך אתם בדרך כלל מקבלים תשלום מהלקוחות?
100% חיוב אחרי שהלקוח מקבל את מה שקנה
מקדמה מראש, ואז היתרה המלאה אחרי המסירה
מפוזר באופן שווה על פני הזמן
100% חיוב כשהלקוח מסכים לקנות
שאלה 12
12
איזה אחוז מהמחזור הכולל ייצג הלקוח הגדול ביותר שלכם בשנה שעברה?
1-15%
16-25%
26-50%
51%+
→ הקודם
הבא ←
שלב 6 מתוך 16 · סיכון ותלות
סיכונים ותלות
בנוסף, רמת התלות בלקוחות גדולים ובבעלים משפיעה משמעותית על שווי החברה.
שאלה 13
13
איזה מהבאים מתאר הכי טוב את ההשפעה הפוטנציאלית של איבוד הלקוח הגדול ביותר:
כמעט לא יסבול כלל, וישרוד
יסבול קצת, אבל ישרוד
יסבול הרבה, אבל ישרוד
יסבול הרבה, ולא ישרוד
שאלה 14
14
איזה אחוז מהמכירות/הכנסות שלכם הוא חוזר (מנויים, חוזי תחזוקה)?
אפס
1-25%
26-50%
51-75%
76-100%
שאלה 15
15
איזה אחוז מהכנסות החברה מתבצע אישית על ידכם או שותפים?
אפס
1-25%
26-50%
51-75%
76-100%
→ הקודם
הבא ←
שלב 7 מתוך 16 · ניהול כישרונות
החלפת ספקים ועובדים
יתרה מכך, קלות ההחלפה של ספקים ועובדי מפתח מלמדת על החוסן של הארגון.
שאלה 16
16
כמה קל או קשה יהיה להחליף את הספק החשוב ביותר שלכם?
קל מאוד
די קל
די קשה
קשה מאוד
בלתי אפשרי
שאלה 17
17
כמה קל או קשה יהיה להחליף את האנשים שעוסקים במכירות ושיווק?
קל מאוד
די קל
די קשה
קשה מאוד
בלתי אפשרי
שאלה 18
18
כמה קל או קשה יהיה להחליף את האנשים שעוסקים בעיצוב ואספקת המוצר/שירות?
קל מאוד
די קל
די קשה
קשה מאוד
בלתי אפשרי
→ הקודם
הבא ←
שלב 8 מתוך 16 · חזון וצמיחה
תחזית צמיחה וסקילביליות
כתוצאה מכך, נבחן את התחזית לעתיד הקרוב ואת יכולת הסקילביליות של העסק.
שאלה 19
19
ב-12 החודשים הבאים, האם אתם מצפים שההכנסות שלכם יהיו:
ירידה
נשארות ברמה הנוכחית
עלייה של עד 10%
עלייה של 11-20%
עלייה של 21-30%
עלייה של יותר מ-30%
שאלה 20
20
איזה מהבאים מתאר הכי טוב את האפשרות למכור יותר ללקוחות הקיימים:
הלקוחות שלנו די מוצו - אנחנו כבר מוכרים להם הכל
יש מוצר או שניים משלימים שנוכל למכור
יש כמות סבירה של מוצרים ושירותים אחרים
יש הרבה מוצרים ו/או שירותים משלימים אחרים
שאלה 21
21
אספקת פי חמישה מהכמות הנוכחית שאתם מוכרים תהיה:
בלתי אפשרי
קשה מאוד
די קשה
די קל
קל מאוד
→ הקודם
הבא ←
שלב 9 מתוך 16 · חזון וצמיחה
הרחבה ומטרות
ראשית, הרחבה גיאוגרפית ומטרות אסטרטגיות הן אינדיקטורים חשובים לפוטנציאל.
שאלה 22
22
האם שכפול העסק שלכם לשרת אזור גיאוגרפי חדש יהיה:
בלתי אפשרי
קשה מאוד
די קשה
די קל
קל מאוד
שאלה 23
23
איך העסק שלכם יתפקד אם הייתם מחוץ לפעילות למשך 3 חודשים:
כמעט לא יסבול כלל, וישרוד
יסבול קצת, אבל ישרוד
יסבול הרבה, אבל ישרוד
יסבול הרבה, ולא ישרוד
שאלה 24
24
אם הייתם יכולים להשיג רק אחד מהיעדים הבאים ב-12 החודשים הבאים:
לגדל את ההכנסות הכוללות (מכירות)
לגדל את הרווח הנקי
להיות מוכרים יותר כמומחה בתחום
→ הקודם
הבא ←
שלב 10 מתוך 16 · יעוץ וערכים
ייעוץ ועושר
בנוסף, נבין את התפיסה שלכם בנושא ייעוץ, עושר וחששות ממכירה.
שאלה 25
25
למי הייתם פונים בסבירות הגבוהה ביותר לייעוץ בנושא בניית ערך החברה:
רואה חשבון
בנקאי עסקי
מתווך עסקי
מאמן עסקי
יועץ עסקי
חבר קרוב או בן משפחה
מתכנן יציאה
יזם חבר
יועץ השקעות
עורך דין
איש מקצוע M&A
אף אחד
שאלה 26
26
איזה מהבאים מתאר הכי טוב את ההגדרה שלכם למישהו שהוא עשיר?
יש לו מספיק כסף לעשות מה שהוא רוצה, מתי שהוא רוצה
אדם עם לפחות 36 מיליון ₪ בנכסים הניתנים להשקעה
יש לו מספיק כסף חסוך לכסות את הוצאות החיים החודשיות שלו לשארית החיים
שאלה 27
27
איזה מהבאים מתאר את החשש הגדול ביותר שלכם כשמדובר במכירת העסק:
לא לקבל את הערך שאני חושב שהעסק שלי שווה
לא יהיה לי מה לעשות בפנסיה
לאכזב את העובדים שלי
שאף אחד לא יוכל לנהל דברים טוב כמו שעשיתי
שהמורשת שבניתי לא תמשיך או תשתנה
→ הקודם
הבא ←
שלב 11 מתוך 16 · יעוץ וערכים
מטרות ארוכות טווח
לאחר מכן, המטרה ארוכת הטווח ואיכות צוות ההנהלה הם נדבך מרכזי בהערכת השווי.
שאלה 28
28
איזה מהבאים מתאר הכי טוב את המטרה ארוכת הטווח שלכם לעסק:
למכור את העסק שלי לצד שלישי
להעביר את העסק שלי לילדים שלי
להעביר את העסק שלי לדור הבא של מנהלים
לסגור את העסק שלי
אחר
שאלה 29
29
איזה מהבאים מתאר הכי טוב את מה שאתם מחפשים ביועץ?
רקורד של עזרה לחברות צמיחה מהירה
רקורד של עזרה לחברות בתעשייה שלי
רקורד של עזרה לחברות בעיר שלי
שאלה 30
30
איזה מהבאים מתאר הכי טוב את צוות ההנהלה שלכם?
אין לנו כזה
יש לנו כמה אנשים בכירים שמתפקדים כמנהיגים לא רשמיים
יש לנו מנהלים אחראים על מכירות/שיווק וייצור השירותים/מוצרים
יש לנו צוות הנהלה במקום עם חבילת תגמולים ארוכת טווח
→ הקודם
הבא ←
שלב 12 מתוך 16 · נתונים כספיים
רווחיות והכנסות
כעת, נעבור לנתונים כספיים — שולי רווח, היקף הכנסות וקצב הצמיחה.
שאלה 31
31
מה היו שולי הרווח שלכם (לפני מס) בשנה הכספית המושלמת האחרונה?
הפסדנו כסף
0-10%
11-20%
יותר מ-20%
שאלה 32
32
מה היו ההכנסות השנתיות של החברה בשקלים חדשים בשנה שעברה?
פחות מ-358,000 ₪
358,000 - 1,800,000 ₪
1,800,000 - 3,600,000 ₪
3,600,000 - 10,700,000 ₪
10,700,000 - 17,900,000 ₪
17,900,000 - 35,800,000 ₪
35,800,000 - 71,600,000 ₪
71,600,000 ₪+
שאלה 33
33
כשמשווים את השנה הכספית האחרונה עם השנה הקודמת, האם ההכנסות שלכם:
ירדו
נשארו ברמה הנוכחית
עלו בעד 10%
עלו בין 11-20%
עלו 21-30%
עלו ביותר מ-30%
→ הקודם
הבא ←
שלב 13 מתוך 16 · נתונים כספיים
רישום כספי ותזרים
כמו כן, רמת הרישום הכספי וניהול תזרים המזומנים משפיעים על השקיפות והערך.
שאלה 34
34
איזה מהבאים מתאר הכי טוב את הגישה שלכם לרישום כספי?
אנחנו נותנים לרואה החשבון ערימת קבלות והם מבינים את זה
אנחנו עוקבים אחרי דברים בעצמנו באמצעות תוכנת חשבונאות
אנחנו שוכרים משרד רו״ח להכין דוח הודעה לקורא כל שנה
אנחנו שוכרים משרד רו״ח לבצע ביקורת חשבונאית כל שנה
אנחנו שוכרים משרד רו״ח לייצר דוחות מבוקרים כל שנה
שאלה 35
35
מה שולי הרווח הגולמי הטיפוסיים שלכם?
פחות מ-40%
40%-60%
61-80%
יותר מ-80%
שאלה 36
36
איזה מהמשפטים הבאים מתאר הכי טוב את צרכי המזומנים שלכם:
אנחנו צריכים יותר מזומנים ממה שאנחנו מייצרים - מגייסים באופן קבוע
אנחנו צריכים יותר מזומנים מדי פעם - מנסים לגייס או ללוות
העסק מייצר עודף מזומנים שאנחנו משקיעים מחדש או שומרים
העסק מייצר עודף מזומנים שאנחנו מחלקים לבעלי המניות
→ הקודם
הבא ←
שלב 14 מתוך 16 · השפעה והצעות
השפעה ורווחי עבר
יתרה מכך, נסכם את ההשפעה ברשתות, את הרווחים ההיסטוריים והצעות קנייה.
שאלה 37
37
אנא העריכו את ההשפעה שלכם (עוקבים ברשתות חברתיות ומנויים):
אפס
0-999
1,000 - 9,999
10,000 - 99,999
100,000+
שאלה 38
38
אנא העריכו את הרווח לפני מס (או הפסד) לשלוש השנים האחרונות:
השנה שעברה (₪)
לפני שנתיים (₪)
לפני 3 שנים (₪)
שאלה 39
39
האם קיבלתם הצעה בכתב לקנות את העסק שלכם בשנה האחרונה?
כן
לא
→ הקודם
הבא ←
שלב 15 מתוך 16 · סיכום
כפול הצעה, תעשייה וגיל
לסיכום, נבדוק את הפרטים הסופיים - כפול ההצעה, תעשייה ושנת הקמה.
שאלה 40
40
איזה כפול של הרווחים ייצגה ההצעה? (אם ענית כן)
0 כפול רווחים
1 כפול רווחים
2 כפול רווחים
3 כפול רווחים
4 כפול רווחים
5 כפול רווחים
6 כפול רווחים
7 כפול רווחים
8+ כפול רווחים
שאלה 41
41
איזה מהבאים מתאר הכי טוב את התעשייה שלכם:
ייצור
ציוד תקשורת
טכנולוגיה
תוכנה
שירותים
קמעונאות
בריאות
פיננסים
בנייה
אחר
שאלה 42
42
באיזו שנה התחלתם את העסק שלכם?
בחר שנה
20262025202420232022202120202019201820172016201520142013201220112010200920082007200620052004200320022001200019991998199719961995199419931992199119901989198819871986198519841983198219811980197919781977197619751974197319721971197019691968196719661965196419631962196119601959195819571956195519541953195219511950
→ הקודם
לסיום ←
שלב אחרון
שליחת השאלון
כתוצאה מכך, כעת אנו מוכנים לשלוח את תוצאות השאלון שלכם. בנוסף, תקבלו דוח מותאם אישית במייל לפי 8 מחוללי הערך של ValueBuilder.
מה קורה לאחר השליחה?
התוצאות נשלחות אוטומטית לצוות NIRMAKO לניתוח מקצועי
ניר מקובסקי יצור עמכם קשר בתוך 48 שעות
תקבלו דוח מפורט עם 8 מחוללי הערך של ValueBuilder
שיחת ייעוץ ראשונית ללא עלות וללא התחייבות
המידע שלכם מאובטח ולא מועבר לצד שלישי
→ הקודם
שלח שאלון ←
<!-- =====================================================================
ValueBuilder Questionnaire — Consolidated v1.5
✅ Bot Protection (5 layers): honeypot, min-time, junk data, min-answers, dedup
✅ Route B preserved: receives session from JAWS chat handoff
✅ Route A preserved: standalone fill from page
✅ Chat return preserved: opens widget after submit with vbqInitToken
✅ Email preserved: Web3Forms to
[email protected] +
[email protected]
✅ Idempotency: sessionStorage hash blocks duplicate submits within 60s
-------------------------------------------------------------------------
Drop this script INSTEAD of the existing ... block.
HTML body above remains identical.
===================================================================== -->
(function(){
'use strict';
const VBQ = {
jawsBase: 'https://lingering-bird-4409.10011334.workers.dev',
publicKey: 'CtNJGD2BrA84gJcHQBFC9nDWDyRSqLkk',
chatOpenDelayMs: 2500,
totalSteps: 16
};
// 🛡️ PROTECTION CONSTANTS
const VBQ_PAGE_LOADED_AT = Date.now();
const VBQ_MIN_TIME_SEC = 30; // Humans can't fill 42 questions in < 30s
const VBQ_MIN_ANSWERS = 30; // Real users answer ≥ 30/42 questions
const VBQ_DEDUP_KEY = 'vbq_last_submit';
const VBQ_DEDUP_TTL_MS = 60000; // Block identical resubmit for 60 seconds
let vbqSessionId = null;
let currentStep = 0;
// 🛡️ HELPERS — content hash + dedup
function vbqHash(str){
let h = 0;
for(let i = 0; i < str.length; i++){
h = ((h < VBQ_DEDUP_TTL_MS) return false;
return true;
} catch(e){ return false; }
}
function vbqMarkSubmitted(lead, count){
try {
sessionStorage.setItem(VBQ_DEDUP_KEY, JSON.stringify({
hash: vbqHash(lead.email + '|' + lead.company + '|' + count),
ts: Date.now()
}));
} catch(e){}
}
function vbqDetectBot(form){
// Layer 1: Honeypot
const honeypot = form.querySelector('input[name="botcheck"]');
if(honeypot && honeypot.checked){
console.warn('[VBQ] 🛡️ Honeypot triggered — silent block');
return 'honeypot';
}
// Layer 2: Time-on-page
const elapsed = Math.floor((Date.now() - VBQ_PAGE_LOADED_AT) / 1000);
if(elapsed < VBQ_MIN_TIME_SEC){
console.warn('[VBQ] 🛡️ Too fast: ' + elapsed + 's — silent block');
return 'too_fast';
}
return null;
}
function setup(){
const root = document.getElementById('vbq-root');
if(!root){
console.warn('[VBQ] #vbq-root not found, aborting setup');
return;
}
function goToStep(n){
n = parseInt(n, 10);
if(isNaN(n) || n VBQ.totalSteps) return;
currentStep = n;
const screens = root.querySelectorAll('.vbq-screen');
for(let i=0; i<screens.length; i++){
screens[i].style.setProperty('display', 'none', 'important');
}
const target = root.querySelector('.vbq-screen[data-step="' + n + '"]');
if(target){
target.style.setProperty('display', 'block', 'important');
target.style.animation = 'vbqSlide .4s ease-out';
}
const radio = document.getElementById('vbq-s' + n);
if(radio){ try { radio.checked = true; } catch(e){} }
const wrap = root.querySelector('.vbq-progress-wrap');
if(wrap) wrap.style.setProperty('display', n === 0 ? 'none' : 'block', 'important');
const fill = root.querySelector('.vbq-progress-fill');
if(fill) fill.style.width = (n === 0 ? 0 : Math.round((n/VBQ.totalSteps)*100)) + '%';
const nums = root.querySelectorAll('.vbq-stepnum');
for(let j=0; j<nums.length; j++){ nums[j].style.display = 'none'; }
const activeNum = root.querySelector('.vbq-stepnum-' + n);
if(activeNum) activeNum.style.display = 'inline';
try {
const c = root.querySelector('.vbq-container');
if(c) c.scrollIntoView({behavior:'smooth', block:'start'});
} catch(e){}
}
root.addEventListener('click', function(e){
let el = e.target;
while(el && el !== root){
if(el.tagName === 'LABEL' && el.hasAttribute('for')){
const m = el.getAttribute('for').match(/^vbq-s(\d+)$/);
if(m){
e.preventDefault();
e.stopPropagation();
goToStep(parseInt(m[1], 10));
return;
}
}
el = el.parentNode;
}
});
// ✅ ROUTE B preserved — load session handoff from JAWS chat
(function loadSessionFromUrl(){
const params = new URLSearchParams(window.location.search);
const sid = params.get('vbq_session');
if(!sid || !/^[0-9a-f-]{36}$/i.test(sid)) return;
vbqSessionId = sid;
console.log('[VBQ] Route B detected, session:', sid);
fetch(VBQ.jawsBase + '/blueprint/session/' + encodeURIComponent(sid))
.then(function(r){ return r.json(); })
.then(function(data){
if(data.error){ console.warn('[VBQ] Session load failed:', data.error); vbqSessionId = null; return; }
if(data.lead){
const setVal = function(id, v){ const el = document.getElementById(id); if(el && v) el.value = v; };
setVal('vbq-name', data.lead.name);
setVal('vbq-phone', data.lead.phone);
setVal('vbq-email', data.lead.email);
setVal('vbq-company', data.lead.company);
}
if(data.source === 'jaws_handoff'){
const banner = document.createElement('div');
banner.style.cssText = 'background:#0f2744;color:#c9a227;padding:14px 24px;text-align:center;font-weight:600;font-size:.95rem;border-bottom:3px solid #c9a227;font-family:Heebo,sans-serif;direction:rtl';
const n = data.lead && data.lead.name;
banner.textContent = n
? 'שלום ' + n + ', ממשיכים מהצ\'אט שלך עם JAWS — הפרטים שלך כבר מולאו'
: 'ממשיכים מהצ\'אט שלך עם JAWS — הפרטים שלך כבר מולאו';
const c = document.querySelector('.vbq-container');
if(c) c.insertBefore(banner, c.firstChild);
}
})
.catch(function(err){ console.warn('[VBQ] Session load error:', err); vbqSessionId = null; });
})();
root.addEventListener('change', function(e){
if(e.target && e.target.type === 'radio' && e.target.name && /^q\d+_/.test(e.target.name)){
const grp = root.querySelectorAll('input[name="' + e.target.name + '"]');
for(let i=0; i<grp.length; i++){
const o = grp[i].closest('.vbq-option');
if(o) o.classList.remove('vbq-selected');
}
const s = e.target.closest('.vbq-option');
if(s) s.classList.add('vbq-selected');
}
});
function collectAnswers(){
const answers = {};
const qTextMap = {};
const allBoxes = root.querySelectorAll('.vbq-qbox');
for(let b=0; b<allBoxes.length; b++){
const numEl = allBoxes[b].querySelector('.vbq-qnum');
const txtEl = allBoxes[b].querySelector('.vbq-qtext');
if(numEl && txtEl){
const qn = numEl.textContent.trim();
if(/^\d+$/.test(qn)){ qTextMap['q' + qn] = txtEl.textContent.trim(); }
}
}
const radios = root.querySelectorAll('input[type="radio"][name^="q"]:checked');
for(let i=0; i<radios.length; i++){
const m = radios[i].name.match(/^q(\d+)_/);
if(m){
const qid = 'q' + m[1];
answers[qid] = { text: qTextMap[qid] || '', value: radios[i].value };
}
}
const inputs = root.querySelectorAll('input[type="text"][name^="q"], input[type="number"][name^="q"], input[type="tel"][name^="q"], select[name^="q"]');
const q38Parts = {};
for(let j=0; j 0){
const p1 = q38Parts['q38_profit_1'] || '[לא מולא]';
const p2 = q38Parts['q38_profit_2'] || '[לא מולא]';
const p3 = q38Parts['q38_profit_3'] || '[לא מולא]';
answers['q38'] = {
text: qTextMap['q38'] || '',
value: 'שנה אחרונה: ' + p1 + ' ₪ | לפני שנתיים: ' + p2 + ' ₪ | לפני 3 שנים: ' + p3 + ' ₪'
};
}
return answers;
}
function escapeHtml(s){
return String(s||'').replace(/&/g,'&').replace(//g,'>').replace(/"/g,'"').replace(/'/g,''');
}
function renderResultsCard(result){
const drivers = result.drivers || {};
const weakest = (result.weakest_drivers || []).slice(0, 3);
const weakRows = weakest.map(function(code){
const d = drivers[code];
if(!d) return '';
const pct = Math.max(0, Math.min(100, d.score || 0));
const color = pct >= 70 ? '#1d9e75' : (pct >= 50 ? '#c9a227' : '#c0392b');
return '
' + escapeHtml(d.name_he || code) + '
' + pct + '
';
}).join('');
return '
השאלון הושלם
הציון הכולל שלך
' + (result.total_score || 0) + '/100
3 הדרייברים החלשים ביותר — מה שצריך לשפר קודם
' + weakRows + '
הניתוח המלא ממתין לך
JAWS כבר ניתח כל אחד מ-8 הדרייברים ובנה לך המלצות אישיות. ניר ייצור איתך קשר ישירות תוך 48 שעות עם הדוח המלא.
💬 פתח את הצ\'אט וקבל את הניתוח המלא ';
}
// ✅ CHAT RETURN preserved — opens JAWS widget after submit
function openJawsChatWidget(initToken){
try {
if(window.JawsChat && typeof window.JawsChat.open === 'function'){
window.JawsChat.open(initToken ? { vbqInitToken: initToken } : {});
return true;
}
} catch(e){}
try {
if(window.openJawsChat && typeof window.openJawsChat === 'function'){
window.openJawsChat(initToken);
return true;
}
} catch(e){}
try {
if(window.Jaws && typeof window.Jaws.openChat === 'function'){
window.Jaws.openChat(initToken ? { vbqInitToken: initToken } : {});
return true;
}
} catch(e){}
try {
const candidates = document.querySelectorAll('[id*="jaws" i] button, [class*="jaws" i] button, [id*="chat" i] button:not(#vbq-open-chat-btn), .chat-bubble, .chat-fab, [data-chat-trigger]');
for(let i=0; i 0 && r.height > 0){ c.click(); return true; }
}
} catch(e){}
return false;
}
function triggerChatHandoff(chatInitToken){
setTimeout(function(){
const opened = openJawsChatWidget(chatInitToken);
if(opened){
console.log('[VBQ] ✅ Chat opened automatically');
} else {
console.log('[VBQ] Chat widget not detected — user can click manual button. Token:', chatInitToken);
}
}, VBQ.chatOpenDelayMs);
}
root.addEventListener('click', function(e){
if(e.target && (e.target.id === 'vbq-open-chat-btn' || (e.target.closest && e.target.closest('#vbq-open-chat-btn')))){
e.preventDefault();
const opened = openJawsChatWidget(null);
if(!opened){
const btn = document.getElementById('vbq-open-chat-btn');
if(btn){
btn.outerHTML = '
';
}
}
}
});
// ✅ EMAIL preserved — Web3Forms to
[email protected] +
[email protected]
function buildWeb3FormsPayload(lead, answers, industry, startYear, blueprintResult){
const w3f = {
access_key: 'e17851c4-12fa-4f7a-8c86-f25d3bb70526',
subject: 'ValueBuilder ✦ ' + lead.company + ' ✦ ' + lead.name + (blueprintResult ? ' ✦ ציון ' + (blueprintResult.total_score || '?') + '/100' : ''),
from_name: 'NIRMAKO ValueBuilder'
};
w3f['01_שם_מלא'] = lead.name;
w3f['02_טלפון'] = lead.phone;
w3f['03_מייל'] = lead.email;
w3f['04_חברה'] = lead.company;
w3f['05_מסלול'] = vbqSessionId ? 'Route B — handoff מ-JAWS chat (session: ' + vbqSessionId + ')' : 'Route A — מילוי אורגני';
w3f['06_תעשייה'] = industry || '—';
w3f['07_שנת_הקמה'] = startYear || '—';
w3f['08_מספר_תשובות'] = Object.keys(answers).length + ' / 42';
if(blueprintResult){
w3f['09_ציון_כולל'] = (blueprintResult.total_score || 0) + ' / 100';
if(blueprintResult.weakest_drivers && blueprintResult.drivers){
const weakest = blueprintResult.weakest_drivers.slice(0, 3).map(function(code){
const d = blueprintResult.drivers[code];
return d ? (d.name_he || code) + ' (' + (d.score || 0) + ')' : code;
}).join(' | ');
w3f['10_דרייברים_חלשים'] = weakest;
}
if(blueprintResult.drivers){
const all = Object.keys(blueprintResult.drivers).map(function(code){
const d = blueprintResult.drivers[code];
return (d.name_he || code) + ': ' + (d.score || 0);
}).join(' | ');
w3f['11_כל_הדרייברים'] = all;
}
}
const qids = Object.keys(answers).sort(function(a,b){
return parseInt(a.replace('q',''),10) - parseInt(b.replace('q',''),10);
});
for(let i=0; i<qids.length; i++){
const qid = qids[i];
const num = qid.replace('q','').padStart(2,'0');
const txt = (answers[qid].text || '').substring(0, 60);
w3f[num + '_' + qid + '_' + txt] = answers[qid].value;
}
return w3f;
}
function sendWeb3Forms(lead, answers, industry, startYear, blueprintResult){
const payload = buildWeb3FormsPayload(lead, answers, industry, startYear, blueprintResult);
console.log('[VBQ] Sending Web3Forms email', {company: lead.company, hasScore: !!blueprintResult});
return fetch('https://api.web3forms.com/submit', {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },
body: JSON.stringify(payload)
})
.then(function(r){ return r.json(); })
.then(function(data){
if(data.success){ console.log('[VBQ] ✅ Web3Forms email sent successfully'); }
else { console.warn('[VBQ] ⚠️ Web3Forms responded but not success:', data); }
return data;
})
.catch(function(err){
console.error('[VBQ] ❌ Web3Forms email failed:', err);
throw err;
});
}
/* ============== SUBMIT HANDLER (with 5-layer protection) ============== */
const form = document.getElementById('vbq-form');
if(form){
form.addEventListener('submit', function(e){
e.preventDefault();
const btn = document.getElementById('vbq-btnSubmit');
const status = document.getElementById('vbq-emailStatus');
// 🛡️ LAYERS 1+2: Honeypot + Time-on-page (silent block — bot learns nothing)
const botReason = vbqDetectBot(form);
if(botReason){
// Show fake "processing" then clear — bot has nothing to retry against
if(status) status.innerHTML = '
מעבד...
';
if(btn){ btn.disabled = true; btn.textContent = 'מעבד...'; }
setTimeout(function(){
if(btn){ btn.disabled = false; btn.textContent = 'שלח שאלון ←'; }
if(status) status.innerHTML = '';
}, 4000);
return;
}
const lead = {
name: ((document.getElementById('vbq-name') ||{}).value || '').trim(),
phone: ((document.getElementById('vbq-phone') ||{}).value || '').trim(),
email: ((document.getElementById('vbq-email') ||{}).value || '').trim(),
company: ((document.getElementById('vbq-company')||{}).value || '').trim()
};
if(!lead.name || !lead.phone || !lead.email || !lead.company){
if(status) status.innerHTML = '
חסרים פרטים אישיים. חזרו לשלב 1 ומלאו שם, טלפון, מייל ושם חברה.
';
goToStep(1);
return;
}
if(!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(lead.email)){
if(status) status.innerHTML = '
כתובת המייל לא תקינה. אנא חזרו לשלב 1 לתיקון.
';
return;
}
// 🛡️ LAYER 3: Junk data
if(lead.name.length < 2 || lead.company.length < 2){
if(status) status.innerHTML = '
שם וחברה חייבים להיות לפחות 2 תווים
';
goToStep(1);
return;
}
if(/^\d+$/.test(lead.company)){
if(status) status.innerHTML = '
שם החברה חייב להיות טקסט, לא רק מספרים
';
goToStep(1);
return;
}
if(lead.phone.replace(/\D/g, '').length < 9){
if(status) status.innerHTML = '
מספר טלפון לא תקין (לפחות 9 ספרות)
';
goToStep(1);
return;
}
const answers = collectAnswers();
const answeredCount = Object.keys(answers).length;
const industry = answers.q41 ? answers.q41.value : null;
const startYear = answers.q42 ? parseInt(answers.q42.value, 10) || null : null;
// 🛡️ LAYER 4: Min answers
if(answeredCount < VBQ_MIN_ANSWERS){
if(status) status.innerHTML = '
השאלון לא הושלם — אנא ענו על לפחות ' + VBQ_MIN_ANSWERS + ' שאלות מתוך 42 (כרגע: ' + answeredCount + ')
';
return;
}
// 🛡️ LAYER 5: Deduplication
if(vbqIsDuplicate(lead, answeredCount)){
console.warn('[VBQ] 🛡️ Duplicate submission within 60s — blocked');
if(status) status.innerHTML = '
השאלון כבר נשלח. ניר ייצור איתך קשר בקרוב.
';
if(btn){ btn.style.display = 'none'; }
return;
}
vbqMarkSubmitted(lead, answeredCount);
if(btn){ btn.disabled = true; btn.textContent = 'מנתח את התשובות שלך...'; }
if(status){
status.innerHTML = '
📊 מחשב ציון ומפעיל ניתוח AI
כל אחד מ-8 הדרייברים מנותח במקביל. זה לוקח כ-5-10 שניות.
';
}
const payload = {
public_key: VBQ.publicKey,
session_id: vbqSessionId,
session_uuid: vbqSessionId || (window.crypto && crypto.randomUUID ? crypto.randomUUID() : ('vbq-' + Date.now() + '-' + Math.random().toString(36).slice(2))),
lead: lead,
answers: answers,
industry: industry,
business_start_year: startYear
};
console.log('[VBQ] Submitting to JAWS BLUEPRINT', {
route: vbqSessionId ? 'B (handoff)' : 'A (organic / standalone)',
session_id: vbqSessionId,
answered: answeredCount + '/42',
company: lead.company
});
fetch(VBQ.jawsBase + '/blueprint/submit', {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },
body: JSON.stringify(payload)
})
.then(function(r){ return r.json().then(function(data){ return { ok: r.ok, status: r.status, data: data }; }); })
.then(function(res){
console.log('[VBQ] JAWS responded', {ok: res.ok, status: res.status, hasScore: !!(res.data && res.data.total_score)});
if(!res.ok || res.data.error){
throw new Error(res.data.detail || res.data.error || 'HTTP ' + res.status);
}
// Atomic render — wrap to never break on email/chat failure
try {
if(status){ status.innerHTML = renderResultsCard(res.data); }
if(btn){ btn.style.display = 'none'; btn.disabled = false; }
const prevBtns = document.querySelectorAll('.vbq-screen[data-step="16"] .vbq-btn-prev');
for(let p=0; p<prevBtns.length; p++){ prevBtns[p].style.display = 'none'; }
console.log('[VBQ] ✅ Result card rendered, score:', res.data.total_score);
} catch(renderErr){
console.error('[VBQ] renderResultsCard threw:', renderErr);
if(status){ status.innerHTML = '
✅ הניתוח הושלם בהצלחה! ניר ייצור איתך קשר תוך 48 שעות עם הדוח המלא.
'; }
if(btn){ btn.style.display = 'none'; }
}
// ✅ CHAT RETURN — fires for both Route A (standalone) and Route B (handoff)
try {
if(res.data.chat_init_token){ triggerChatHandoff(res.data.chat_init_token); }
} catch(chatErr){ console.warn('[VBQ] Chat handoff error:', chatErr); }
try { window.scrollTo({top: 0, behavior:'smooth'}); }catch(e){}
// ✅ EMAIL — sent last, in own try-catch, cannot affect render
try {
sendWeb3Forms(lead, answers, industry, startYear, res.data).catch(function(err){
console.warn('[VBQ] Web3Forms email failed (non-blocking):', err);
});
} catch(w3fSyncErr){
console.error('[VBQ] Web3Forms threw synchronously (non-blocking):', w3fSyncErr);
}
})
.catch(function(err){
console.error('[VBQ] JAWS submit failed:', err);
// Even on JAWS fail, still try email (don't lose the lead)
try {
sendWeb3Forms(lead, answers, industry, startYear, null).catch(function(err2){
console.warn('[VBQ] Fallback Web3Forms failed:', err2);
});
} catch(w3fSyncErr){
console.error('[VBQ] Fallback Web3Forms threw:', w3fSyncErr);
}
if(status){
status.innerHTML = '
⚠️ נתקלנו בתקלה זמנית בניתוח
פרטי התקלה: ' + escapeHtml(err.message) + '
';
}
if(btn){ btn.disabled = false; btn.textContent = 'נסה שוב'; }
});
});
}
goToStep(0);
console.log('[VBQ] v1.5 (5-layer bot protection + dedup) loaded, page loaded at:', new Date(VBQ_PAGE_LOADED_AT).toISOString());
}
if(document.readyState === 'loading'){
document.addEventListener('DOMContentLoaded', setup);
} else {
setup();
}
})();