Налаштування Shopify Functions для кастомної логіки знижок та доставки
Уявіть: інтернет-магазин одягу хоче надати знижку 15% на другий товар у кошику, але тільки для клієнтів з Києва та при сумі чека від 5000 грн. Стандартні знижки Shopify не вміють перевіряти геолокацію та враховувати склад кошика за позиціями. Рішення — Shopify Functions — синхронні хуки, які виконуються в момент розрахунку кошика, не залишаючи інфраструктуру Shopify. За 5 мс ми можемо застосувати складне правило знижки або доставки, не збільшуючи час чекауту. За даними Shopify, до 20% користувачів йдуть при затримці чекауту більше 2 секунд, тому оптимізація Shopify Checkout за допомогою кастомних функцій стає стандартом для великих магазинів. Наша команда налаштовує такі функції під ключ: від простих відсотків до складної геолокії доставки. Вартість розробки індивідуальна, економія порівняно із зовнішніми мікросервісами сягає 30%, а середній чек збільшується на 15-25% після впровадження персоналізованих знижок.
Чому Shopify Functions швидші за зовнішні API?
Функції працюють всередині процесу чекауту — це не зовнішній API, який робить HTTP-запит. Вони компілюються в WebAssembly (Rust) або використовують Javy runtime (JavaScript) і виконуються з лімітом 5–10 мс. Жодних мережевих викликів, усі дані передаються через input.graphql. Це гарантує передбачувану продуктивність і нульову затримку для користувача. Докладніше про архітектуру — у документації Shopify Functions.
Де працюють Functions
| API функцій | Призначення |
|---|---|
cart_transform |
Зміна рядків кошика перед чекаутом (бандли, модифікації) |
discounts |
Кастомні знижки (фіксовані, відсоток, BXGY) |
payment_customization |
Приховування/перейменування способів оплати |
shipping_discount |
Знижка на доставку |
delivery_customization |
Приховування/перейменування/сортування методів доставки |
fulfillment_constraints |
Обмеження на розбивку по складах |
order_routing |
Маршрутизація замовлень по складах |
Functions пишуться на Rust (компілюється в WebAssembly) або JavaScript/TypeScript (через Javy runtime). Rust кращий для складної логіки — швидший та економніший за лімітами. Розробка Shopify Functions включає проектування input.graphql та Metafields.
Як реалізувати складну знижку без втрати продуктивності?
Використовуємо Rust або TypeScript, оптимізуючи кожен запит. Всю підготовку даних виносимо на рівень Metafields — функція отримує вже готові конфіги та застосовує їх за мілісекунди. Наш досвід показує: при правильному проектуванні функція вкладається в 5 мс навіть з 5 рівнями вкладеності. В одному проекті ми реалізували знижку з урахуванням історії замовлень через Metafields: функція завантажувала JSON з пороговими значеннями за останні 30 днів і застосовувала підвищену знижку для лояльних клієнтів — все вкладалося в ліміт 4 мс. Налаштування знижок Shopify за допомогою Functions дозволяє реалізувати будь-які бізнес-правила без уповільнення чекауту.
Приклад: знижка за обсяг замовлення (JavaScript)
input.graphql — описує, які дані Shopify передасть функції:
# input.graphql query RunInput { cart { lines { id quantity merchandise { ... on ProductVariant { id product { id tags metafield(namespace: "custom", key: "volume_discount_tier") { value } } } } } } discountNode { metafield(namespace: "custom", key: "tiers") { value } } } src/run.ts — логіка функції:
import type { RunInput, FunctionRunResult } from "../generated/api"; interface DiscountTier { quantity: number; percentage: number; } export function run(input: RunInput): FunctionRunResult { const tiersJson = input.discountNode?.metafield?.value; const tiers: DiscountTier[] = tiersJson ? JSON.parse(tiersJson) : []; if (!tiers.length) return { discounts: [], discountApplicationStrategy: "FIRST" }; const discounts = []; for (const line of input.cart.lines) { const variant = line.merchandise; if (variant.__typename !== "ProductVariant") continue; const product = variant.product; if (!product.tags.includes("volume-eligible")) continue; const applicableTier = tiers .filter(t => line.quantity >= t.quantity) .sort((a, b) => b.quantity - a.quantity)[0]; if (!applicableTier) continue; discounts.push({ targets: [{ cartLine: { id: line.id } }], value: { percentage: { value: String(applicableTier.percentage) } }, message: `Знижка ${applicableTier.percentage}% за кількість (від ${applicableTier.quantity} шт.)`, }); } return { discounts, discountApplicationStrategy: "FIRST", }; } Як налаштувати доставку з геолокацією?
Використовуємо delivery_customization API. Функція отримує адресу доставки через input.graphql і може приховати або пересортувати методи доставки. Наприклад, для віддалених регіонів з тривалою доставкою приховуємо експрес-методи. Логіка пишеться на Rust для максимальної швидкості — типовий час виконання 3 мс. Для інтеграції зверніться до наших інженерів. Кастомна доставка Shopify з геолокацією — одне з частих застосувань Functions.
Обмеження доставки Shopify
| Обмеження | Значення | Рішення |
|---|---|---|
| Час виконання | 5 мс (Rust/WASM), 10 мс (JS) | Мінімізуємо ітерації, кешуємо дані в Metafields |
| Пам'ять | 10 МБ | Не завантажуємо великі JSON-масиви — використовуємо пагінацію на рівні запиту |
| Мережеві запити | Заборонені | Всі дані передаємо через input.graphql |
| Доступ до БД | Немає | Складні конфіги зберігаємо в Metafields |
Процес роботи
- Аналітика — розбираємо бізнес-правила, проектуємо вхідні дані.
- Проектування — обираємо мову та оптимізуємо запити під ліміти.
- Реалізація — пишемо код, готуємо input.graphql та Metafields.
- Тестування — локально через
npm testабоcargo test, потім на staging. - Деплой — через Shopify CLI, активуємо в Admin.
Терміни залежать від складності: проста знижка — від 2 робочих днів, функція з геологікою — до 2 тижнів.
Тестування та деплой
npm run test # або cargo test shopify app deploy shopify app logs # перегляд логів Додаткові команди для налагодження
shopify app log --tail Що входить в нашу роботу
- Проектування архітектури функції з урахуванням лімітів
- Написання коду на Rust або TypeScript
- Розробка input.graphql та схем Metafields
- Деплой та інтеграція з Admin
- Документація з налаштування правил
- Підтримка після запуску (1 місяць)
Наша команда — сертифіковані Shopify-розробники з 5+ років досвіду та 30+ реалізованими проектами. Оцінимо ваше завдання за 1 робочий день. Зв'яжіться з нами — допоможемо впровадити кастомну логіку знижок та доставки, яка не гальмує чекаут. Отримайте консультацію.







