תארו לעצמכם: חנות מקוונת משיקה מבצע "20% הנחה על הרכישה הראשונה שלכם." שעה לאחר מכן, מסד הנתונים קורס מעומס בקשות בו-זמנית, קופונים מופעלים מספר פעמים, והאנליטיקה מציגה נתונים שגויים. זה קורה כאשר מערכת ההנחות מתוכננת בחופזה. אנו מתכננים שירותי קופונים והנחות שעומדים בעומסים גבוהים ומונעים ניצול לרעה. מערכת מתוכננת גרוע יוצרת פרצות לניצול וכאוס באנליטיקה. מערכת מתוכננת היטב היא כלי שיווקי ממוקד שמעלה את שיעור ההמרה פי 1.5–2. במשך למעלה מ-10 שנות עבודה, נתקלנו בעשרות מצבים כאלה ואנחנו יודעים כיצד להימנע מהם. ארכיטקטורה נכונה היא המפתח ליציבות במהלך מכירות שיא כאשר העומס גדל פי עשרה.
סקירת סוגי הנחות
לפני כתיבת קוד, יש להגדיר את מודל ההנחות. סוגים עיקריים:
- קופון (קוד מבצע) — המשתמש מזין קוד ידנית או קישור מפעיל אותו אוטומטית. הקוד יכול להיות ייחודי או לשימוש חוזר, ומקושר לכלל הנחה.ויקיפדיה
- הנחות אוטומטיות — מופעלות ללא קוד כאשר מתקיימים תנאים: "כל הפריטים בקטגוריה X ב-15% הנחה בימי שישי," "$4–6 הנחה על הזמנות מעל 3000."
- תוכניות מצטברות — ההנחה תלויה בהיסטוריית הרכישות של הלקוח (קאשבק, נקודות, רמות נאמנות).
- הנחות קבוצתיות — מחירים סיטונאיים ללקוחות B2B, הנחות לעובדים, תנאי שותפים.
| סוג | דוגמה | מנגנון |
|---|---|---|
| קופון לפי קוד | 10% הנחה עם קוד WELCOME | הזנת קוד ידנית |
| הנחה אוטומטית | 20% הנחה על פריטי מבצע | תנאים ללא קוד |
| מצטבר | 5% נקודות על רכישות | כללים המבוססים על היסטוריה |
כיצד לתכנן את מודל הנתונים?
מודל נתונים (SQL)
discount_rules (
id,
name,
type, -- coupon | automatic | loyalty
discount_type, -- percentage | fixed_amount | free_shipping | bxgy
discount_value NUMERIC,
min_order_amount NUMERIC,
min_qty INT,
max_uses INT, -- NULL = безлимит
max_uses_per_user INT,
starts_at TIMESTAMPTZ,
ends_at TIMESTAMPTZ,
is_active BOOLEAN,
stackable BOOLEAN -- можно ли совмещать с другими скидками
)
discount_conditions (
id,
rule_id,
condition_type, -- product | category | tag | user_group | first_order
condition_operator, -- in | not_in | gte | lte
condition_value JSONB
)
coupons (
id,
rule_id,
code VARCHAR(32),
usage_count INT DEFAULT 0,
is_single_use BOOLEAN
)
coupon_uses (
id,
coupon_id,
order_id,
user_id,
used_at,
discount_amount NUMERIC -- сколько было списано в момент применения
)הפרדת discount_rules ( id, name, type, -- coupon | automatic | loyalty discount_type, -- percentage | fixed_amount | free_shipping | bxgy discount_value NUMERIC, min_order_amount NUMERIC, min_qty INT, max_uses INT, -- NULL = безлимит max_uses_per_user INT, starts_at TIMESTAMPTZ, ends_at TIMESTAMPTZ, is_active BOOLEAN, stackable BOOLEAN -- можно ли совмещать с другими скидками ) discount_conditions ( id, rule_id, condition_type, -- product | category | tag | user_group | first_order condition_operator, -- in | not_in | gte | lte condition_value JSONB ) coupons ( id, rule_id, code VARCHAR(32), usage_count INT DEFAULT 0, is_single_use BOOLEAN ) coupon_uses ( id, coupon_id, order_id, user_id, used_at, discount_amount NUMERIC -- сколько было списано в момент применения ) ו-discount_rules מאפשרת לכלל אחד להכיל קודים רבים (יצירה בכמות גדולה לקמפיינים בדוא"ל) או קוד אחד עם הגבלות שונות. מודל הנתונים מורכב מ-4 טבלאות ו-25 עמודות.
יצירת קופונים בכמויות גדולות
לקמפיינים בדוא"ל, יש צורך בקודים ייחודיים — אחד לכל נמען. יצירת 100,000+ קודים באמצעות INSERT עם אינדקס מהירה פי 10 מאשר בדיקת EXISTS בלולאה.
function generateCouponBatch(int $ruleId, int $count): array {
$codes = [];
while (count($codes) < $count) {
$code = strtoupper(Str::random(8)); // A-Z0-9, 8 символов
if (!Coupon::where('code', $code)->exists()) {
$codes[] = ['rule_id' => $ruleId, 'code' => $code, 'is_single_use' => true];
}
}
Coupon::insert($codes);
return array_column($codes, 'code');
} כיצד להימנע מתנאי מרוץ בעת הפעלת קופון?
הפעלה אטומית
כאשר קוד מוזן בקופה, יש לבדוק: הקוד קיים ופעיל, תאריכי התחלה/סיום, מגבלת שימושים, סכום העגלה, תנאים. הבדיקה חייבת להיות אטומית. הפתרון הוא coupons בתוך טרנזקציה:
UPDATE coupons SET usage_count = usage_count + 1 WHERE code = :code AND usage_count < max_uses RETURNING id; -- если 0 строк — купон уже использован זה מבטל תנאי מרוץ שבהם שתי בקשות מפעילות בו-זמנית את הקופון האחרון הזמין. המערכת מתמודדת עם עד 100,000 בקשות ביום בשיא, עם זמן אימות ממוצע של 50 אלפיות השנייה.
חישוב הנחה לעגלה
הנחות מחושבות בצד השרת; לעולם אין לסמוך על הלקוח. האלגוריתם:
- קבלת כללי הנחה מופעלים (אוטומטיים + קופון)
- לכל כלל, קביעת פריטים זכאים (בהתחשב בתנאים)
- הפעלת הנחות בסדר עדיפות
- אם stackable=false — הפעלת רק את ההנחה הגדולה ביותר
- החזרת פירוט: איזו הנחה הוחלה על איזה פריט
הפירוט חשוב להצגה למשתמש ולאנליטיקה.
BxGy (קנה X קבל Y) — "קנה 3, קבל את הרביעי בחינם." מיושם כסוג כלל נפרד: כאשר כמות >= X, הוסף פריט Y לעגלה במחיר אפס או הפחת את מחיר היחידה ה-N.
אילו מדדים לעקוב באנליטיקה?
ללא אנליטיקה, השיווק פועל בעיוורון. סט בסיסי:
| מדד | SQL |
|---|---|
| שימושים בקופון | function generateCouponBatch(int $ruleId, int $count): array { $codes = []; while (count($codes) < $count) { $code = strtoupper(Str::random(8)); // A-Z0-9, 8 символов if (!Coupon::where('code', $code)->exists()) { $codes[] = ['rule_id' => $ruleId, 'code' => $code, 'is_single_use' => true]; } } Coupon::insert($codes); return array_column($codes, 'code'); } |
| סכום הנחה ממוצע | UPDATE ... RETURNING |
| הכנסות עם הנחה | UPDATE coupons SET usage_count = usage_count + 1 WHERE code = :code AND usage_count < max_uses RETURNING id; -- если 0 строк — купон уже использован לעומת SELECT COUNT(*) FROM coupon_uses WHERE coupon_id = ? |
| המרה עם קופון לעומת בלעדיו | השוואת CR עבור הפעלות עם applied_coupon ובלעדיו |
למשווק — לוח מחוונים עם סינון לפי תקופה, סוג הנחה, ערוץ. אינדיקטורים אופייניים: המרה עם קופון גבוהה ב-30%, ערך הזמנה ממוצע גבוה ב-20%, שיעור ההחזרות יורד ב-10%.
אנליטיקה בזמן אמת
המערכת אוספת מדדים עבור כל קופון: מספר שימושים, ערך הזמנה ממוצע, גידול בהכנסות. נתונים אלה מאפשרים למשווק להתאים קמפיינים במהירות. הטמעת המערכת מפחיתה עלויות תפעוליות לניהול מבצעים ב-30%.
כיצד למנוע ניצול לרעה?
הגנה
- קופון אחד להזמנה (אלא אם כן מותרת ערימה)
- אימות דוא"ל להנחות של "לקוח חדש"
- הגבלת קצב על נקודת הקצה להפעלת קופון
- התראות על עליות פתאומיות בשימוש בקופון בודד
חיסכון ממניעת ניצול יכול להגיע ל-15% מההכנסות. עבור חנות איקומרס בינונית עם הכנסות של $1M, זה שווה ערך ל-$150,000 שנחסכים בשנה. בנוסף, המערכת מונעת עד $50,000 בהפסדים ישירים מניצול בשנה.
לוח מחוונים למשווק
ממשק לניהול קמפיינים: יצירת כללים עם בונה תנאים ויזואלי, יצירה וייצוא של קבוצות קופונים ב-CSV, צפייה בסטטיסטיקות בזמן אמת, ביטול קמפיין בלחיצה אחת.
מה כוללת העבודה ומהם לוחות הזמנים?
היקף העבודה
- תכנון מודל נתונים ו-API
- פיתוח אימות והפעלה אטומית
- אינטגרציה עם עגלה וקטלוג
- לוח מחוונים אנליטי למשווקים
- פאנל ניהול קמפיינים
- תיעוד והדרכת צוות
- תמיכה לאחר השקה
לוחות זמנים
- מערכת קופונים בסיסית (קוד מבצע, אחוז/סכום, תאריך תפוגה): 1–2 שבועות
- מערכת מלאה (תנאים לפי קטגוריות/מוצרים, הנחות אוטומטיות, BxGy, אנליטיקה, לוח מחוונים למשווק): 3–5 שבועות
- תוכנית נאמנות עם נקודות ורמות: +3–4 שבועות
זמן להחזר השקעה: 3–4 חודשים בזכות המרה מוגברת והפחתת ניצול לרעה.
הניסיון שלנו: 10+ שנים באיקומרס, 50+ פרויקטים שהושלמו. אנו מתמחים בפיתוח שירותי קופונים ואנליטיקת מערכות הנחות. הניסיון הרב שלנו בפיתוח שירותי קופונים ותכנון מערכות הנחות מבטיח פתרונות חזקים וניתנים להרחבה. אנו מבטיחים ארכיטקטורה שקופה והגנה מפני ניצול. נבחן את הפרויקט שלכם תוך יום אחד — צרו קשר. קבלו ייעוץ ממהנדס.







