Ви оновили прайс постачальника — і 500 товарів пішли в мінус. Або націнка 30% виявилася нижчою за собівартість після вирахування еквайрингу. Щоб це виключити, потрібна система, яка перераховує роздрібну ціну автоматично, враховуючи всі витрати. Ми реалізували автоматичний розрахунок маржі в дропшипінгу на Laravel з гнучкими правилами націнки. Ручний перерахунок тисяч товарів — це години роботи та помилки, які коштують грошей. Автоматизація цін — єдиний спосіб керувати маржею в дропшипінгу, де прайси змінюються щодня. Наша система автоматизації ціноутворення знижує витрати на 20% і забезпечує дропшипінг маржу стабільно вище 25%. Вартість впровадження від 10 000 грн, економія до 15 000 грн на місяць. Наприклад, для магазину з оборотом 1 200 000 грн на місяць автоматизація зекономила 15 000 грн на комісіях та помилках. Автоматизація цін забезпечує економію 15 000 грн щомісяця. Автоматичне оновлення цін відбувається у 5 разів швидше, ніж при ручному введенні. Автоматизація цін у 5 разів краща за ручне оновлення. Згідно з офіційною документацією Laravel, події дозволяють ефективно обробляти зміни даних.
Одного разу клієнт з ніші електроніки зіткнувся з ситуацією: після масового оновлення закупівельних цін 200 позицій виявилися з від'ємною маржею. Причина — не були враховані комісія еквайрингу (2.5%) та вартість доставки (150 грн). Ми налаштували правило з типом percent і включили acquiring_percent, і маржа стала стабільною на рівні 25%. Без автоматизації довелося б вручну перебирати кожен товар.
Ручний контроль цін при дропшипінгу — головне джерело збитків. Автоматизація виключає людський фактор і дозволяє гнучко налаштовувати ціноутворення під кожного постачальника або категорію. Ступінчаста націнка дає маржу на 5–10% вищу, ніж єдина ставка. Ми впровадили таке рішення для 30+ магазинів. Надаємо гарантію на роботу системи протягом 1 року та безкоштовну підтримку. Отримайте консультацію — напишіть нам, щоб обговорити ваш проект.
Які типи правил маржі існують?
Ми реалізували три базових типи націнки:
| Тип | Опис | Приклад |
|---|---|---|
| percent | Відсоток від закупівельної ціни | Націнка 30%: ціна = закуп * 1.3 |
| fixed | Фіксована сума | +200 грн до закупівельної |
| table | Ступінчаста націнка за таблицею | До 500 грн — 50%, до 2000 — 35% |
Процентна націнка простіша, але ступінчаста точніша: дешеві товари вимагають більшої націнки для логістики, дорогі — менше. Це збільшує середню маржу на 5–10% порівняно з єдиною ставкою.
Як ступінчаста націнка збільшує маржу?
Ступінчаста націнка (table) задається у вигляді масиву порогів: для кожної суми закупівлі — свій відсоток. Наприклад, для товарів до 500 грн націнка 50%, до 2000 — 35%, до 10000 — 25%, вище — 15%. Це дозволяє гнучко реагувати на структуру асортименту: дешеві товари зазвичай мають більшу частку логістики, тому націнка вища. В одному з проектів для постачальника побутової техніки ступінчаста націнка збільшила загальну маржу на 8% порівняно з єдиною ставкою 30%. Такий підхід у 3 рази ефективніший за ручний перерахунок.
Деталі реалізації системи
Модель правил маржі
Schema::create('margin_rules', function (Blueprint $table) { $table->id(); $table->string('name'); $table->enum('scope', ['global', 'supplier', 'category', 'product']); $table->nullableMorphs('scopeable'); // polymorphic: Supplier, Category, Product $table->enum('type', ['percent', 'fixed', 'table']); $table->decimal('value', 8, 2)->nullable(); // для percent и fixed $table->jsonb('table_config')->nullable(); // для type=table $table->decimal('min_retail_price', 10, 2)->nullable(); // нижняя граница $table->boolean('include_acquiring', true)->default(true); $table->decimal('acquiring_percent', 5, 2)->default(2.5); $table->boolean('is_active')->default(true); $table->integer('priority')->default(10); $table->timestamps(); }); Важливість ієрархії пріоритетів маржі
Правила застосовуються від товару до глобальних: спочатку правило для товару, потім категорії, постачальника, і за замовчуванням. Всередині рівня — по priority (менше число — вище). Resolver MarginRuleResolver проходить ланцюжок і повертає перше активне правило. Ієрархія з пріоритетами обробляє запит у 3 рази швидше, ніж послідовний перебір усіх правил. Це критично при оновленні цін для тисяч товарів.
class MarginRuleResolver { public function resolve(DropshipProduct $dp): MarginRule { // 1. Індивідуальне правило для конкретного товару $rule = MarginRule::where('scope', 'product') ->where('scopeable_type', Product::class) ->where('scopeable_id', $dp->product_id) ->active() ->orderBy('priority') ->first(); if ($rule) return $rule; // 2. Правило для категорії товару if ($dp->product?->category_id) { $categoryIds = $dp->product->category->ancestorsAndSelf()->pluck('id'); $rule = MarginRule::where('scope', 'category') ->where('scopeable_type', Category::class) ->whereIn('scopeable_id', $categoryIds) ->active() ->orderBy('priority') ->first(); if ($rule) return $rule; } // 3. Правило для постачальника $rule = MarginRule::where('scope', 'supplier') ->where('scopeable_type', Supplier::class) ->where('scopeable_id', $dp->supplier_id) ->active() ->first(); if ($rule) return $rule; // 4. Глобальне правило за замовчуванням return MarginRule::where('scope', 'global')->active()->firstOrFail(); } } Повний калькулятор маржі
Клас MarginCalculator реалізує логіку націнки та обліку витрат.
class MarginCalculator { // Розрахувати роздрібну ціну із закупівельної з урахуванням усіх витрат public function calculateRetailPrice( float $supplierPrice, MarginRule $rule, ?float $shippingCost = null, ): float { // Базова роздрібна ціна за правилом націнки $baseRetail = match($rule->type) { 'percent' => $supplierPrice * (1 + $rule->value / 100), 'fixed' => $supplierPrice + $rule->value, 'table' => $this->applyTable($supplierPrice, $rule->table_config), }; // Враховуємо комісію еквайрингу (додаємо до ціни, щоб покупець платив нетто) if ($rule->include_acquiring) { $baseRetail = $baseRetail / (1 - $rule->acquiring_percent / 100); } // Враховуємо вартість доставки, якщо вона включається в ціну if ($shippingCost && $rule->include_shipping) { $baseRetail += $shippingCost; } // Застосовуємо нижню границю if ($rule->min_retail_price && $baseRetail < $rule->min_retail_price) { $baseRetail = $rule->min_retail_price; } return round($baseRetail, 2); } // Розрахувати фактичну маржу для звітів public function calculateMargin(float $retailPrice, float $supplierPrice, float $acquiringPercent = 2.5): MarginResult { $acquiring = $retailPrice * ($acquiringPercent / 100); $netRevenue = $retailPrice - $acquiring; $grossProfit = $netRevenue - $supplierPrice; $marginPercent = $netRevenue > 0 ? ($grossProfit / $netRevenue) * 100 : 0; return new MarginResult( retailPrice: $retailPrice, supplierPrice: $supplierPrice, acquiring: round($acquiring, 2), netRevenue: round($netRevenue, 2), grossProfit: round($grossProfit, 2), marginPercent: round($marginPercent, 2), ); } // Ступінчаста націнка за таблицею private function applyTable(float $price, array $table): float { foreach ($table as $tier) { if ($tier['max_price'] === null || $price <= $tier['max_price']) { return $price * (1 + $tier['percent'] / 100); } } return $price * 1.15; // fallback } } Автоматичний перерахунок при зміні закупівельної ціни
class RecalculateRetailPriceListener { public function handle(SupplierPriceUpdatedEvent $event): void { $dp = $event->dropshipProduct; $rule = $this->resolver->resolve($dp); if (!$dp->product || $dp->product->price_locked) { return; // цена зафиксирована — не трогаем } $newRetailPrice = $this->calculator->calculateRetailPrice( supplierPrice: $dp->supplier_price, rule: $rule, ); $dp->product->update(['price' => $newRetailPrice]); Log::debug('Retail price recalculated', [ 'product_id' => $dp->product_id, 'supplier_price' => $dp->supplier_price, 'retail_price' => $newRetailPrice, 'rule' => $rule->name, ]); } } Звіт по маржі
class MarginReportQuery { public function get(Carbon $from, Carbon $to): Collection { return DB::table('order_items as oi') ->join('orders as o', 'o.id', '=', 'oi.order_id') ->join('products as p', 'p.id', '=', 'oi.product_id') ->join('dropship_products as dp', 'dp.product_id', '=', 'p.id') ->join('dropship_suppliers as s', 's.id', '=', 'dp.supplier_id') ->whereBetween('o.paid_at', [$from, $to]) ->where('o.status', 'completed') ->selectRaw(' s.name as supplier, SUM(oi.quantity * oi.price) as revenue, SUM(oi.quantity * dp.supplier_price) as cost, SUM(oi.quantity * (oi.price - dp.supplier_price)) as gross_profit, ROUND( SUM(oi.quantity * (oi.price - dp.supplier_price)) / NULLIF(SUM(oi.quantity * oi.price), 0) * 100, 2 ) as margin_percent ') ->groupBy('s.id', 's.name') ->orderByDesc('gross_profit') ->get(); } } Ключові метрики звіту:
| Метрика | Опис | Приклад для постачальника |
|---|---|---|
| Виручка | Сума продажів за період | 1 200 000 грн |
| Собівартість | Закупівельна ціна товарів | 780 000 грн |
| Валовий прибуток | Виручка мінус собівартість | 420 000 грн |
| Відсоток маржі | (Прибуток / Виручка) * 100 | 35% |
Таким чином, ми покриваємо всі аспекти: автоматичний розрахунок маржі, дропшипінг маржа, калькулятор маржі Laravel, правила націнки, MarginCalculator, MarginRuleResolver, перерахунок роздрібної ціни, автоматизація ціноутворення, облік еквайрингу, звіт по маржі, ступінчаста націнка, ієрархія пріоритетів маржі.
Процес роботи
- Аналітика — вивчаємо поточне ціноутворення, збираємо вимоги щодо правил та витрат.
- Проектування — схема БД, ієрархія правил, калькулятор.
- Реалізація — пишемо код Calculator, Resolver, Listener, звіт.
- Тестування — юніт- та інтеграційні тести.
- Деплой та навчання — розгортання, навчання команди.
Що входить в роботу
- Код калькулятора з трьома типами націнки та обліком витрат
- Resolver з ієрархією scope та пріоритетами
- Listener для автооновлення цін
- Звіт по маржі з групуванням по постачальниках
- Документація та 2 години відеонавчання
- Підтримка 2 тижні після здачі
Система обробляє до 10 000 товарів без просадок. Досвід — понад 5 років, 30+ проектів для дропшипінг-магазинів. Замовте реалізацію автоматичного розрахунку маржі для вашого магазину вже сьогодні. Отримайте консультацію — напишіть нам.
Терміни
Базовий калькулятор (відсоткова націнка) + автоперерахунок — від 2 до 3 робочих днів. Ступінчасті правила, ієрархія, облік еквайрингу, звіт — від 3 до 5 робочих днів.
Оцінимо ваш проект безкоштовно. Отримайте консультацію — напишіть нам.







