Настройка 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 рабочий день. Свяжитесь с нами — поможем внедрить кастомную логику скидок и доставки, которая не тормозит чекаут. Получите консультацию.







