Настройка Shopify Functions для кастомной логики скидок и доставки
Представьте: интернет-магазин одежды хочет дать скидку 15% на второй товар в корзине, но только для клиентов из Москвы и при сумме чека от $45–65. Стандартные скидки 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 рабочий день. Свяжитесь с нами — поможем внедрить кастомную логику скидок и доставки, которая не тормозит чекаут. Получите консультацию.







