База фішок до товарів
Фішки ({{ productTipsCount }})
Вставте артикули — по одному в рядок (можна «артикул <пробіл/таб> текст»). Артикули, яких немає у вставленому списку, буде видалено з бази.
| Артикул | Фішка | Оновлено | Дії |
|---|---|---|---|
| {{ productTipsSearch ? 'Нічого не знайдено' : 'Фішок ще немає — додайте першу' }} | |||
| {{ t.sku }} | {{ t.tip }} | {{ new Date(t.updatedAt).toLocaleDateString('uk-UA') }} · @{{ t.by }} | |
Імпорт скарг (Prom.ua відгуки)
Масово додати скарги з тексту
| Дата | № Замовлення | Клієнт | Тип | Опис | Статус |
|---|---|---|---|---|---|
| Не вдалось розпізнати | |||||
| {{ new Date(e.date_created).toLocaleString('uk-UA', { dateStyle: 'short', timeStyle: 'short' }) }} | {{ e.order_id || '—' }} | {{ e.client }} | {{ e.type }} | {{ e.description }} | дубль пропустити оновити нова |
Перевірка наявності
Масова перевірка артикулів у базі товарів
| Артикул | Назва | Постачальник | Ціна USD |
|---|---|---|---|
| Жоден артикул не в наявності | |||
| {{ x.sku }} | {{ x.name }} | {{ x.supplier }} +{{ x.suppliersCount - 1 }} | ${{ x.price }} |
| Артикул | Назва | Постачальник(и) |
|---|---|---|
| Усі знайдені в наявності | ||
| {{ x.sku }} БАН | {{ x.name }} | {{ x.suppliersAll }} |
Звідки списуємо товар?
Кожен рядок — 1 шт. Оберіть локацію для кожної. «− Немає ніде» = необлікований, піде мінусом на ЗАГАЛЬНИЙ.
Оберіть локацію для КОЖНОЇ штуки — без цього завершити не можна
Створення прибуткової накладної в Asteril
{{ activeOrder ? (activeOrder.customName || activeOrder.id) : '' }}{{ asterilArrivalSupplier }}
Відправляємо лише цього оптовика · тільки нову (ще не відправлену) кількість
| Артикул | Назва | К-сть | Ціна за 1, грн | Сума, грн |
|---|---|---|---|---|
| Немає товарів (усі НВ або порожні) | ||||
| {{ p.sku }} ALT | {{ p.qty }} | {{ p.priceUah }} ₴ | {{ Number(p.totalUah).toLocaleString('uk-UA') }} ₴ | |
Товар з артикулом {{ inventoryUnknown.sku }} не знайдено на залишках. Введіть дані для інвентаризації:
Всі кандидати оброблені
Всі позиції оброблені
Вхід в систему
| Артикул | Назва | ⚠ Проблема | Покази | Кліки | CPC ₴ | Витрати ₴ | Ліди | Ціна ліда ₴ | Без лідів ₴ | Не забрані | Скасовані | Закуп ₴ | Продаж ₴ | Маржа ₴ | Залишки | В рекламі | Збиткові | Коментар |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Завантаження… | ||||||||||||||||||
| Даних ще немає. Встанови Google Ads Script (інструкція нижче) — після першого запуску тут з'являться метрики. | ||||||||||||||||||
| {{ pa.tab === 'excluded' ? 'Немає знятих з реклами товарів (знімай галочкою «В рекламі» у вкладці «Усі товари»)' : (pa.tab === 'labeled' ? 'Немає товарів з міткою «Збиткові» (постав галочку в колонці «Збиткові» у вкладці «Усі товари»)' : 'Немає активності за цей тиждень / нічого не знайдено') }} | ||||||||||||||||||
|
{{ r.sku || '—' }}
{{ r.eid }}
|
{{ r.name || '(немає в фіді)' }} |
{{ r.problem > 0 ? r.problem.toLocaleString('uk-UA') : '—' }} | {{ (r.im || 0).toLocaleString('uk-UA') }} | {{ r.cl || 0 }} | {{ (r.cpc || 0).toFixed(2) }} | {{ (r.cost || 0).toFixed(0) }} | {{ (r.conv || 0).toFixed(1) }} | {{ (r.conv || 0) >= 0.5 ? (r.cpl || 0).toFixed(0) : '—' }} | {{ r.wasted > 0 ? r.wasted.toFixed(0) : '—' }} | {{ (r.np || 0) > 0 ? r.np : '—' }} | {{ (r.cn || 0) > 0 ? r.cn : '—' }} | {{ r.buyUah ? r.buyUah.toLocaleString('uk-UA') : '—' }} | {{ r.sellUah ? r.sellUah.toLocaleString('uk-UA') : '—' }} | —{{ r.margin.toLocaleString('uk-UA') }} ({{ paMarginPct(r) }}%) | — {{ r.stock.toLocaleString('uk-UA') }} ({{ r.stockSup }}) |
{{ paWeekComment(r.eid) }}
коментар
|
||
| Разом: {{ paFiltered.length.toLocaleString('uk-UA') }} товарів · показано {{ paView.length }} | {{ paTotals.problem.toLocaleString('uk-UA') }} | {{ paTotals.im.toLocaleString('uk-UA') }} | {{ paTotals.cl }} | {{ paTotals.cpc.toFixed(2) }} | {{ paTotals.cost.toFixed(0) }} | {{ paTotals.conv.toFixed(1) }} | {{ paTotals.conv ? paTotals.cpl.toFixed(0) : '—' }} | {{ paTotals.wasted.toFixed(0) }} | {{ paTotals.np }} | {{ paTotals.cn }} | {{ paTotals.buyUah ? paTotals.buyUah.toLocaleString('uk-UA') : '' }} | {{ paTotals.sellUah ? paTotals.sellUah.toLocaleString('uk-UA') : '' }} | {{ paTotals.margin ? paTotals.margin.toLocaleString('uk-UA') : '' }} | {{ paTotals.stock ? paTotals.stock.toLocaleString('uk-UA') : '' }} | {{ adsLabeled.length ? adsLabeled.length + ' міт.' : '' }} | |||
| Тиждень | Витр ₴ | Кліки | Ліди | CPL ₴ | ⚠ | НЗ | Скас | Коментар |
|---|---|---|---|---|---|---|---|---|
| {{ w.label }}● | {{ w.cost ? w.cost.toFixed(0) : '—' }} | {{ w.cl || '—' }} | {{ w.conv ? w.conv.toFixed(1) : '—' }} | {{ w.conv >= 0.5 ? w.cpl.toFixed(0) : '—' }} | {{ w.problem || '—' }} | {{ w.np || '—' }} | {{ w.cn || '—' }} | {{ w.comment || '—' }} |
{{ cb.tab === 'ai' ? 'Розмовний ШІ-бот: спілкується з клієнтом живою мовою (ElevenLabs + Claude)' : 'Автообдзвін клієнтів із незабраними посилками (Binotel) — програє голосове нагадування' }}
Аналітика з'явиться після першого реального обдзвону (тестові дзвінки не рахуються). Дані підтягуються з Binotel за ~1–2 хв після дзвінка.
Голосовий файл обирається окремо для кожного сценарію (кнопка ✏ біля сценарію). Тут — спільні для всіх сценаріїв межі обдзвону.
{{ cb.err }}
| № | Клієнт | Телефон | Статус | Дзвінків | Останній | Дія |
|---|---|---|---|---|---|---|
| {{ row.orderId }} | {{ row.name || '—' }} | {{ row.phone }} | Нова Пошта Укрпошта {{ row.status }} | {{ row.calls || 0 }} |
{{ row.lastCallAt ? cbFmt(row.lastCallAt) : '—' }}
взяв · {{ row.lastBillsec }}с
кинув · {{ row.lastBillsec }}с
не взяв
…
|
взяв трубку |
Можна писати номер (152) або з префіксом (status_152). Приклад: 152 = Нова Пошта, 146 = Укрпошта.
{{ cb.trace.join('\n') }}
Зберігаються на сервері й назовні не віддаються — після збереження поля лишаються порожніми, це нормально.
Акаунт Anthropic не потрібен — LLM платиться разом із хвилинами ElevenLabs. База знань заливається в агента при синхронізації. Пісочниця в цьому режимі не працює — тестуйте кнопкою «Test AI agent» у кабінеті ElevenLabs.
Потрібен ключ Anthropic. Натомість отримуєте пісочницю тут, миттєві правки бази знань без пересинхронізації і доступ до даних CRM під час розмови.
Точний перелік — у випадайці LLM в кабінеті ElevenLabs; сюди вставте рядок звідти.
Для телефону швидкість відповіді помітна на слух — Haiku відповідає найшвидше.
Це і є навчання. Блоки збираються в інструкцію, яку бот читає перед кожною реплікою — правки діють одразу, без перезапуску.
Порожньо. Створіть перший блок — наприклад, «Хто ти» або «Скрипт: незабрана посилка».
Голосом, через мікрофон, без телефона й без кабінету ElevenLabs. Оберіть замовлення — і бот говоритиме так, ніби телефонує саме цьому клієнту.
Натисніть «Почати розмову» й дозвольте доступ до мікрофона.
Мозок зараз вбудований у ElevenLabs — пісочниця тут не працює. Тестуйте кнопкою «Test AI agent» у кабінеті ElevenLabs (там же можна говорити в мікрофон). Пісочниця вмикається, коли перемкнути мозок на «Наш Claude».
Поговоріть із ботом текстом — це той самий мозок, що піде в телефон. Побачили дурницю → виправили блок вище → перевірили тут.
Напишіть щось, як написав би клієнт.
Картка замовлення готується до дзвінка й передається боту разом із набором номера — він одразу знає товар, суму й доставку, без пауз на запити.
{{ ai.ordersErr }}
Натисніть «Оновити», щоб підтягнути замовлення.
| № | Клієнт | Телефон | Товари | Сума | Дзвінків | |
|---|---|---|---|---|---|---|
| {{ o.orderId }} | {{ o.name }} | {{ o.phone }} | {{ o.items.length ? o.items[0].name : '—' }} +{{ o.items.length - 1 }} | {{ o.total }} | {{ o.calls || '—' }} | |
{{ o.card }}
|
||||||
Бот подзвонить на вказаний номер і заговорить. Дзвоніть спершу собі.
Кожна розмова — і телефонна, і тестова через мікрофон — зберігається текстом. Це матеріал, на якому бота вдосконалюють: видно, де він плутається, що питають клієнти і які інструменти викликав.
{{ ai.trMsg }}
Поки порожньо. Після першої розмови натисніть «Зібрати нові».
Нотатка: {{ t.note }}
Поки порожньо.
{{ ai.transcript.error }}
Система сама визначає вид замовлення за оплатою і застосовує правила лише для увімкнених видів.
Для замовлення Нова Пошта + не оплачено: калькулятор пакування обирає коробку → додається відповідний товар за ціною з налаштувань (нижче) → створюється ТТН. Тестовий режим — по одному замовленню.
Номер статусу в Asteril + назва (напр. 70 / Автопідв-наложки).
| Статус (№) | Назва | |
|---|---|---|
Для кожної коробки вкажіть артикул товару, який додати, і ціну. Систему обере коробку калькулятором пакування й підставить відповідний артикул.
| Артикул | Коробка (з калькулятора) | Ціна, грн | |
|---|---|---|---|
| Немає рядків. Натисніть «Рядок», щоб додати коробку → артикул. | |||
Коли калькулятор не може обрати коробку — додаємо товар за сумою замовлення. Порожнє «Сума до» = «і вище».
| Сума до, грн | Артикул | Ціна, грн | |
|---|---|---|---|
| Немає резервних рівнів. | |||
До собівартості упаковки (з таблиць вище) додається націнка залежно від суми замовлення. Напр.: пакет 10 грн + націнка 10 грн = ціна 20 грн. Порожнє «Сума до» = «і вище».
| Сума замовлення до, грн | Націнка, грн | |
|---|---|---|
| Немає рівнів націнки. | ||
Скануйте товари для інвентаризації
Програма автоматично порівняє відскановане з очікуваними залишками.
| Наявність | Артикул | Назва | {{ isInventoryMode ? 'Очікувано' : 'Залишок' }} | Відскановано | Різниця | Лежить | Без продажу | Собівартість 1 шт | Загальна собівартість |
|---|---|---|---|---|---|---|---|---|---|
| Немає залишків | |||||||||
| 🟢 🔴 ⚪ | {{ item.sku }} | {{ item.name }} | {{ item.qty }} | {{ inventoryScans[item._key] !== undefined ? inventoryScans[item._key] : 0 }} | {{ (inventoryScans[item._key] !== undefined ? inventoryScans[item._key] : 0) - item.qty > 0 ? '+' : '' }}{{ (inventoryScans[item._key] !== undefined ? inventoryScans[item._key] : 0) - item.qty }} | {{ invAgeDays(item) === null ? '—' : invAgeDays(item) + ' дн' }} | {{ invNoSaleDays(item) === null ? '—' : invNoSaleDays(item) + ' дн' }} | {{ Number(item.cost || 0).toFixed(0) }} ₴ | {{ isInventoryMode ? ((inventoryScans[item._key] !== undefined ? inventoryScans[item._key] : 0) * (item.cost || 0)).toFixed(0) : ((item.qty || 0) * (item.cost || 0)).toFixed(0) }} ₴ |
Товари, які під час синхронізації магазинів автоматично тримаються в наявності (бо є на складі). Кількість ділиться порівну між магазинами, що мають товар. Оновлюється після синхронізації у PriceTool.
| Артикул | Назва | На складі | Соб. 1 шт | Заг. собівартість | Магазинів | По скільки | Розподіл по магазинах | Немає картки на |
|---|---|---|---|---|---|---|---|---|
| {{ restoredSearch ? 'Нічого не знайдено' : 'Немає авто-відновлених товарів. Запустіть синхронізацію магазинів у PriceTool.' }} | ||||||||
| {{ r.sku }} 🔗 | {{ r.name || '—' }} | {{ r.totalQty }} | {{ r.unitCost ? r.unitCost.toFixed(0) + ' ₴' : '—' }} | {{ r.totalCost ? r.totalCost.toLocaleString('uk-UA', { maximumFractionDigits: 0 }) + ' ₴' : '—' }} | {{ r.storesCount }} / {{ r.ofStores }} | {{ r.perStore }} | {{ (r.stores || []).map(s => s.store + ' — ' + s.qty).join(' · ') }} | {{ (r.missing && r.missing.length) ? r.missing.join(', ') : '—' }} |
| Артикул | Назва | Продано за міс. | На складі зараз | Останній продаж |
|---|---|---|---|---|
| {{ soldSearch ? 'Нічого не знайдено' : 'Ще немає зафіксованих продажів за цей місяць. Дані з`являться після синхронізацій PriceTool.' }} | ||||
| {{ r.sku }} 🔗 | {{ r.name || '—' }} | {{ r.sold }} | {{ r.inStock != null ? r.inStock : '—' }} | {{ r.lastAt ? new Date(r.lastAt).toLocaleString('uk-UA', {day:'2-digit', month:'2-digit', hour:'2-digit', minute:'2-digit'}) : '—' }} |
Скануйте артикул товару або введіть вручну
| ID | Дата | Клієнт / Телефон | Статус | Дія |
|---|---|---|---|---|
| Немає замовлень для відправки | ||||
| {{ o.id }} | {{ o.created_at || o.created || o.date }} |
{{ o.client_name || o.client_fio || (o.last_name + ' ' + o.first_name) }}
{{ o.phone || o.client_phone || '' }}
|
{{ getAsterilStatusName(o) }} ВІДГРУЖЕНО {{ fmtShippedInfo(o.shippedInfo) }} {{ getOrderLockInfo(o.id) ? getOrderLockInfo(o.id).managerName : 'Зайнято' }} | |
Скануйте товари або введіть артикул вручну
| Артикул / Назва | К-сть в замовленні | Відскановано | Статус |
|---|---|---|---|
| Завантаження товарів... | |||
|
{{ item.sku }}
{{ item.name }}
ЗАГАЛЬНИЙ: {{ wmsLocFor(item.sku).general }}
{{ rk.rack === 'НЕЗАБРАНІ' ? '📥' : '📍' }} {{ rk.rack }}: {{ rk.qty }}
ВМС: не розкладено
|
{{ item.quantity }} | {{ item.scannedQty }} | |
| Дата | № Замовлення | Статус → Asteril | Менеджер | Тип | Клієнт | Позицій | Штук | Поточний статус |
|---|---|---|---|---|---|---|---|---|
| Немає записів | ||||||||
| {{ formatShipmentDate(s.timestamp) }} | {{ s.orderId }} | — Змінено Не підтв. Помилка |
{{ s.managerName }}
@{{ s.managerLogin }}
|
{{ s.shippingType || '?' }} |
{{ s.clientName }}
{{ s.clientPhone }}
|
{{ s.positionsCount || 0 }} | {{ s.itemsCount || 0 }} | не перевірено ⚠ status_{{ String(s.currentStatusId).replace('status_','') }} status_{{ String(s.currentStatusId).replace('status_','') }} |
Артикул
{{ scanSearchResults.sku }}
Усі замовлення з цим товаром зараз пакують інші менеджери
Знайдено в {{ scanSearchResults.matches.length }} замовленнях
| Накладна | USD | Курс | UAH | Позицій | Статус | Дія |
|---|---|---|---|---|---|---|
|
{{ i.orderName }}
{{ formatPayoutDate(i.createdAt) }} · {{ i.qtyTotal }} шт
|
${{ i.totalUsd }} | {{ i.exchangeRate }} | {{ Number(i.totalUah).toLocaleString('uk-UA') }} ₴ | {{ i.itemsCount }} | Оплачено{{ i.paidAt ? ' ' + formatPayoutDate(i.paidAt) : '' }} Не оплачено |
Накладна — {{ payoutViewingInvoice.supplier }}
{{ payoutViewingInvoice.orderName }}
Створено {{ formatPayoutDate(payoutViewingInvoice.createdAt) }} · Період {{ formatPeriodLabel(invPeriodEnd(payoutViewingInvoice)) }}
| Артикул | Назва | К-сть | Ціна USD | Сума USD |
|---|---|---|---|---|
| Деталі недоступні — пересканувати для отримання items | ||||
| {{ it.k }} | {{ it.n }} | {{ isFinite(Number(it.qty)) ? Number(it.qty) : 0 }} | ${{ isFinite(Number(it.p)) ? Number(it.p) : 0 }} | ${{ ((isFinite(Number(it.p)) ? Number(it.p) : 0) * (isFinite(Number(it.qty)) ? Number(it.qty) : 0)).toFixed(2) }} |
Оплачено {{ formatPayoutDate(payoutViewingInvoice.paidAt) }} (@{{ payoutViewingInvoice.paidBy }})
{{ payoutViewingInvoice.paidComment }}
Редагування накладної
{{ payoutEditingInvoice.supplier }} — {{ payoutEditingInvoice.orderName }}
| Ім'я | Логін | Роль | Суперадмін | Пароль | Дії |
|---|---|---|---|---|---|
| Не знайдено жодного користувача | |||||
| {{ user.firstName }} | {{ user.login }} |
|
|
Excel-файл залишків (артикул — стовпець C, кількість, собівартість).
Спершу завантажте залишки (крок 1).
| Наяв. | SKU | SKU (Пост) | Назва | Постач | Закуп $ | Закуп ₴ | Продаж ₴ | Залишок |
|---|---|---|---|---|---|---|---|---|
| Нічого не знайдено | ||||||||
|
|
{{ p.s }} | {{ (p.p * exchangeRate).toFixed(0) }} ₴ | {{ p.stock != null ? p.stock : '—' }} | |||||
Натисніть або перетягніть файл сюди
Позицій: {{ draft.items.length }}
| SKU | Назва | К-сть | Ціна |
|---|---|---|---|
| {{ item.k }} |
{{ item.n }}
Постачальник у чорному списку!
Артикул не знайдено в базі!
|
{{ item.qty }} | ${{ item.p }} |
| SKU | SKU Пост. | Назва | Закуп $ / Склад Львів | На Сайті ₴ | Продали ₴ | К-сть | Сума | Статус | Дія |
|---|---|---|---|---|---|---|---|---|---|
|
{{ getPriorityLabel(getSupplierPriorityInfo(sup).p) }}
{{ sup }}
({{ getSupplierPriorityInfo(sup).folder }})
{{ calculateSupplierTotals(items).qty }} шт
Закуп: ${{ calculateSupplierTotals(items).sumUsd }}
Продаж: {{ calculateSupplierTotals(items).sellUah }} ₴
{{ note }}
|
|||||||||
|
{{ i.k }}
{{ getProductTip(i.k).tip }}
|
({{ (i.p * exchangeRate).toFixed(0) }} ₴)
Склад Львів: {{ volStock(i).q }} шт · закуп {{ volRealCost(i) ? volRealCost(i).perUnit.toFixed(2) : volStock(i).c }} грн/шт
|
{{ (i.qty * i.p).toFixed(2) }} |
|
||||||
| РАЗОМ: | $ {{ currentTotal }} | ||||||||
| АРТИКУЛ | SKU ПОСТ. | НАЗВА | КІЛЬКІСТЬ | ЗАКУП $ | НА САЙТІ ₴ | ПРОДАЛИ ₴ | СТАТУС | ДІЯ | АЛЬТ | СТЕЛАЖ | ДІЯ |
|---|---|---|---|---|---|---|---|---|---|---|---|
|
{{ getPriorityLabel(getSupplierPriorityInfo(sup).p) }}
{{ sup }}
({{ getSupplierPriorityInfo(sup).folder }})
{{ calculateSupplierTotals(items).qty }} шт
Закуп: ${{ calculateSupplierTotals(items).sumUsd }}
Продаж: {{ calculateSupplierTotals(items).sellUah }} ₴
|
|||||||||||
|
{{ i.k }}
{{ getProductTip(i.k).tip }}
Артикули заводу (скан)
{{ fa }}
|
{{ i.ss || i.k }} |
{{ i.scannedQty }}/{{ i.qty }}
{{ i.asterilSentQty }}
|
({{ (i.p * exchangeRate).toFixed(0) }} ₴)
|
|
|||||||
| Артикул | Назва | Кіл | Вх $ | Статус | Локація | ||
|---|---|---|---|---|---|---|---|
Як імпортувати: Завантажте Excel файл, де:
| Артикул | Зображення | Посилання |
|---|---|---|
| База зображень порожня | ||
| Нічого не знайдено за запитом «{{ imageSearchDebounced }}» | ||
| {{ item.sku }} | {{ item.url }} | |
| Показано перші {{ filteredImages.length }} із {{ Object.keys(imageDb).length }} — скористайтесь пошуком, щоб знайти потрібний артикул | ||
| Артикул | Вага (кг) | Довжина (мм) | Ширина (мм) | Висота (мм) |
|---|---|---|---|---|
| Завантаження бази розмірів... | ||||
| {{ s.sku }} | {{ s.weight }} | {{ s.l }} | {{ s.w }} | {{ s.h }} |
| Наш артикул | Заводські артикули |
|---|---|
| Завантаження… | |
| База порожня | |
| Нічого не знайдено | |
| {{ e.sku }} |
{{ a }}
|
Додані сюди постачальники автоматично отримуватимуть статус "НВ" при імпорті нових замовлень.
| Менеджер | В роботі | Період | День | Тиж. | Міс. |
|---|---|---|---|---|---|
| {{ a.name }} | {{ a.inWork }} | {{ a.custom }} | {{ a.day }} | {{ a.week }} | {{ a.month }} |
Немає скарг
{{ c.description || c.phone || '—' }}
Закрито {{ formatComplaintDateShort(c.close_date) }} · {{ c.closed_by || c.manager }}
Оберіть скаргу зі списку
Тут відображатиметься деталі скарги
{{ complaints[activeComplaintId].description }}
{{ complaints[activeComplaintId].close_comment }}
{{ n.text }}
Опишіть результат та за потреби додайте скріншот