לקוח רוצה לקנות, אבל הפריט אזל מהמלאי. החנות מפסידה מכירה. מערכת הזמנות מוקדמות נועלת את המחיר ומודיעה כשהמלאי מגיע. עם זאת, יישום לקוי מוביל למכירת יתר ולחיובים חוזרים. לדוגמה, אחד הלקוחות שלנו—חנות אלקטרוניקה מקוונת—הפעיל הזמנות מוקדמות לדגמים מוגבלים. ללא בקרה אטומית, הם נתקלו בשיעורי מכירת יתר של עד 15% מההזמנות. לאחר הטמעת המערכת שלנו, מכירת היתר בוטלה לחלוטין. אנו בונים את המנגנון על פעולות מלאי אטומיות, תשלומים דו-שלביים, והתראות אוטומטיות—מבטלים סיכונים ומגדילים את ההמרה ב-30–40%. עלות הפיתוח נקבעת לאחר ביקורת, והיא מחזירה את עצמה דרך המרה גבוהה יותר ופחות החזרות.
אילו בעיות מערכת הזמנות מוקדמות פותרת?
תשלום דו-שלבי ושימור לקוחות. תשלום מקדמי חלקי מוריד את החסם: ההמרה עולה ב-30–40% בהשוואה לתשלום מלא מראש. אבל כשהשארית נגבית עם הגעת הסחורה, הכרטיס עלול לפקוע. הפתרון שלנו שולח קישור תשלום מוגבל בזמן ליתרה, ואם הוא נכשל, מנסה שוב לאחר 24 שעות. זה שומר על עד 85% מהלקוחות שנכשלים בתשלום הראשון.
פרט טכני: הזמנה אטומית
עבור הזמנות מוקדמות מוגבלות, בדיקת מגבלה אטומית היא הדרך היחידה להימנע ממכירת יתר:
UPDATE preorder_campaigns
SET current_count = current_count + :qty
WHERE id = :campaign_id
AND (max_quantity IS NULL OR current_count + :qty <= max_quantity)
AND status = 'active'
RETURNING id, current_count;אם UPDATE preorder_campaigns SET current_count = current_count + :qty WHERE id = :campaign_id AND (max_quantity IS NULL OR current_count + :qty <= max_quantity) AND status = 'active' RETURNING id, current_count; לא מחזיר שורה, המגבלה חרגה. פעולה זו מהירה בסדר גודל מנעילות טבלה ומתמודדת עם עומסי שיא. בפרויקטים שלנו, מבנה זה מעבד עד 10,000 בקשות לדקה ללא התנגשויות. לפי תיעוד PostgreSQL, UPDATE אטומי עם RETURNING מבטיח שלמות תחת גישה מקבילית.
רשימת המתנה ושחרור מקומות. כשהזמנה מוקדמת מבוטלת, המקום מתפנה מיד. טריגר במסד הנתונים מודיע עד 100 משתמשים ברשימת ההמתנה עם הצעה מוגבלת בזמן (24 שעות לרכישה). זה מגדיל את ניצול המקומות ב-20%.
איך אנו מיישמים הזמנות מוקדמות
טכנולוגיות: PHP 8.3 (Laravel 11), PostgreSQL 15, Redis לתורים, Vue 3 לפאנל ניהול. תבניות עיקריות: Repository, Event Sourcing לשרשראות סטטוס, CQRS לדוחות.
סכמה. הטבלאות UPDATE ו-preorder_campaigns מכילות את כל השדות: מצב תשלום, סטטוס, מגבלות, תאריכים. הקישור ל-preorders מופיע רק במימוש.
CREATE TABLE preorder_campaigns (
id BIGSERIAL PRIMARY KEY,
product_id BIGINT NOT NULL REFERENCES products(id),
name VARCHAR(255) NOT NULL,
status VARCHAR(50) NOT NULL DEFAULT 'active', -- active | paused | fulfilled | cancelled
payment_mode VARCHAR(50) NOT NULL DEFAULT 'full', -- full | deposit | free
deposit_percent NUMERIC(5,2),
expected_date DATE,
max_quantity INTEGER,
min_quantity INTEGER,
current_count INTEGER NOT NULL DEFAULT 0,
closes_at TIMESTAMP,
created_at TIMESTAMP NOT NULL DEFAULT NOW()
);
CREATE TABLE preorders (
id BIGSERIAL PRIMARY KEY,
campaign_id BIGINT NOT NULL REFERENCES preorder_campaigns(id),
user_id BIGINT REFERENCES users(id),
email VARCHAR(255) NOT NULL,
variant_id BIGINT NOT NULL REFERENCES product_variants(id),
qty INTEGER NOT NULL DEFAULT 1,
unit_price NUMERIC(12,2) NOT NULL,
deposit_paid NUMERIC(12,2) NOT NULL DEFAULT 0,
total_paid NUMERIC(12,2) NOT NULL DEFAULT 0,
status VARCHAR(50) NOT NULL DEFAULT 'pending', -- pending | deposit_paid | fully_paid | fulfilled | cancelled | refunded
expected_date DATE,
notified_at TIMESTAMP,
order_id BIGINT REFERENCES orders(id),
created_at TIMESTAMP NOT NULL DEFAULT NOW()
);
איך ליישם תשלום דו-שלבי
במצב orders, התשלום מחולק לשני שלבים. ראשית, גבה את הפיקדון בקופה:
class PreorderCheckout {
public function processDeposit(Preorder $preorder, PaymentMethod $method): Payment {
$depositAmount = $preorder->unit_price * $preorder->qty * ($preorder->campaign->deposit_percent / 100);
$payment = $this->gateway->charge([
'amount' => $depositAmount,
'currency' => 'USD',
'description' => "Предзаказ #{$preorder->id}: депозит",
'metadata' => ['preorder_id' => $preorder->id, 'type' => 'deposit'],
]);
$preorder->update([
'deposit_paid' => $depositAmount,
'status' => 'deposit_paid',
]);
return $payment;
}
}שלב שני: גבה את היתרה כשהמלאי מגיע. אם הכרטיס נכשל, הלקוח מקבל אימייל עם קישור תשלום. תור עם ניסיונות חוזרים (עד 3 פעמים במרווחים של יום אחד) מטפל בכישלונות. זה שומר על לקוחות וממזער הפסדים.
למה עדכוני מלאי אטומיים חשובים
עבור הזמנות מוקדמות מוגבלות, בדיקת מגבלה אטומית היא הדרך היחידה להימנע ממכירת יתר.
רשימת המתנה ושחרור מקומות
כשמקום מתפנה, טריגר במסד הנתונים מכניס רשומה ל-CREATE TABLE preorder_campaigns ( id BIGSERIAL PRIMARY KEY, product_id BIGINT NOT NULL REFERENCES products(id), name VARCHAR(255) NOT NULL, status VARCHAR(50) NOT NULL DEFAULT 'active', -- active | paused | fulfilled | cancelled payment_mode VARCHAR(50) NOT NULL DEFAULT 'full', -- full | deposit | free deposit_percent NUMERIC(5,2), expected_date DATE, max_quantity INTEGER, min_quantity INTEGER, current_count INTEGER NOT NULL DEFAULT 0, closes_at TIMESTAMP, created_at TIMESTAMP NOT NULL DEFAULT NOW() ); CREATE TABLE preorders ( id BIGSERIAL PRIMARY KEY, campaign_id BIGINT NOT NULL REFERENCES preorder_campaigns(id), user_id BIGINT REFERENCES users(id), email VARCHAR(255) NOT NULL, variant_id BIGINT NOT NULL REFERENCES product_variants(id), qty INTEGER NOT NULL DEFAULT 1, unit_price NUMERIC(12,2) NOT NULL, deposit_paid NUMERIC(12,2) NOT NULL DEFAULT 0, total_paid NUMERIC(12,2) NOT NULL DEFAULT 0, status VARCHAR(50) NOT NULL DEFAULT 'pending', -- pending | deposit_paid | fully_paid | fulfilled | cancelled | refunded expected_date DATE, notified_at TIMESTAMP, order_id BIGINT REFERENCES orders(id), created_at TIMESTAMP NOT NULL DEFAULT NOW() ); ומכניס משימה ל-RabbitMQ. N המשתמשים הראשונים מקבלים אימייל עם הצעה לרכישה תוך 24 שעות. אם אין תגובה, זה עובר לבא בתור.
CREATE TABLE waitlist_entries (
id BIGSERIAL PRIMARY KEY,
campaign_id BIGINT NOT NULL REFERENCES preorder_campaigns(id),
email VARCHAR(255) NOT NULL,
variant_id BIGINT REFERENCES product_variants(id),
notified BOOLEAN NOT NULL DEFAULT false,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
UNIQUE (campaign_id, email, variant_id)
); מימוש הזמנות מוקדמות כשהמלאי מגיע
המנהל מפעיל את המימוש בלחיצה אחת. ה-deposit עובר על כל ההזמנות המוקדמות הפעילות בסדר FIFO, בודק מלאי, יוצר הזמנה, גובה את היתרה, ושולח התראות:
class PreorderFulfillmentService {
public function fulfill(PreorderCampaign $campaign): FulfillmentResult {
$preorders = $campaign->preorders()
->where('status', 'deposit_paid')
->orWhere('status', 'fully_paid')
->orderBy('created_at')
->get();
$fulfilled = 0;
foreach ($preorders as $preorder) {
DB::transaction(function () use ($preorder, &$fulfilled) {
$reserved = $this->stockService->reserve(
$preorder->variant_id,
$preorder->qty
);
if (!$reserved) {
return;
}
$order = $this->orderFactory->fromPreorder($preorder);
if ($preorder->needsBalancePayment()) {
$this->chargeBalance($preorder);
}
$preorder->update(['status' => 'fulfilled', 'order_id' => $order->id]);
$fulfilled++;
PreorderFulfilled::dispatch($preorder, $order);
});
}
return new FulfillmentResult($fulfilled, $preorders->count());
}
} תקשורת עם לקוחות
הזמנה מוקדמת היא הבטחה. הלקוח חייב תמיד לדעת את הסטטוס. אנו מגדירים התראות אוטומטיות:
| אירוע | ערוץ | תוכן |
|---|---|---|
| הזמנה בוצעה | אימייל | אישור, פרטים, תאריך משוער |
| שינוי תאריך | אימייל + SMS | תאריך חדש, סיבת העיכוב |
| המלאי הגיע | אימייל + Push | הודעה על תחילת משלוח |
| הזמנה נוצרה | אימייל | מספר הזמנה, מעקב |
| קמפיין בוטל | אימייל | הוראות החזר |
התבניות ניתנות לעריכה בפאנל הניהול. תאריך האספקה ניתן תמיד כ"מוערך: תחילת החודש הבא" כדי להפחית ציפיות שגויות.
תצוגת חנות
כרטיס מוצר במצב הזמנה מוקדמת מחליף את הבלוק הסטנדרטי:
- כפתור "הזמנה מוקדמת" במקום "הוסף לסל".
- תאריך אספקה משוער מתחת לכפתור.
- מונה מקומות תפוסים: "47 מתוך 100 שמורים".
- מדד מחסור: "נשארו 12 מקומות".
- בלוק מידע על מדיניות הזמנות מוקדמות והחזרות.
מה כלול בעבודה
כל פרויקט כולל:
- תיעוד ארכיטקטורה וסכמת נתונים.
- הגדרת שער תשלום לתשלומים דו-שלביים.
- אינטגרציה עם מערכת הנהלת חשבונות (1C, MoiSklad).
- פאנל ניהול לניהול קמפיינים.
- תבניות התראות (אימייל, SMS, Push).
- בדיקות עומס (עד 1,000 הזמנות מוקדמות בו-זמנית).
- מדריך למנהלים ולצוות תמיכה.
- אחריות לקוד ל-12 חודשים ותיקונים חינם תוך שבועיים מהמסירה.
צור קשר כדי לדון בפרויקט שלך ולקבל הערכה. אם אתה מאבד לקוחות בגלל פריטים אזולים, הזמן מערכת הזמנות מוקדמות—קבל מנגנון אמין שמתרחב ללא שכתובים.
לוח זמנים ליישום
| שלב | מסגרת זמן |
|---|---|
| מערכת בסיסית (קופה + תשלום מלא + התראות) | 4–6 ימים |
| תשלום דו-שלבי | +2–3 ימים |
| הזמנה מוקדמת קבוצתית | +2 ימים |
| רשימת המתנה עם התראות אוטומטיות | +1–2 ימים |
| פאנל ניהול קמפיינים | +2–3 ימים |
| מערכת מלאה | 2–3 שבועות |
אנו עובדים עם הזמנות מוקדמות מעל 5 שנים, ומסרנו יותר מ-50 פרויקטים למסחר אלקטרוני. המהנדסים שלנו מוסמכים ב-Laravel ו-PostgreSQL. קבל ייעוץ לפרויקט שלך היום.







